Jestem stosunkowo nowy w OOP. Czasami natrafiam na sytuacje, w których nie jestem pewien, gdzie powinna iść metoda. Postaram się podać minimalny przykład; Mam nadzieję, że nie przesadzę i nie będę zbyt abstrakcyjny.Czy funkcja powinna należeć do jednej/obu z dwóch klas lub być wolnostojąca?
Powiedz, że mam klasę Point
, która zawiera pozycję punktu i klasę Line
, która przechowuje równanie linii. Potrzebuję teraz metody obliczającej odległość (prostopadłą) między Point
a Line
. Mogłem zrobić:
- Punkt :: distance_to_line (linia L)
- Linia :: distance_to_point (punkt P)
- funkcją wolnostojący: point_line_distance (linia L, punkt P)
Czy jest ogólnie preferowany sposób w OOP, czy jest zależny od języka? W C++ dostępna jest opcja wolnostojąca, ale z mojego ograniczonego rozumienia języka Java nie można korzystać z funkcji wolnostojących. W takim przypadku utworzysz klasę, taką jak PointLineDistanceCalculator
?
Gdybym był stwarzany taki problem, zrobiłbym następujące. Utwórz pliki 'GeometryHelper'' .h' i '.cpp', które mają kilka darmowych funkcji. Będą robić rzeczy takie jak 'point_line_distance',' line_intersection', itp. – CoryKramer
Czy ma sens, aby punkt miał metody obliczania jego odległości do każdego rodzaju kształtu pod słońcem? Prawdopodobnie nie.Powinna to być funkcja nie będąca członkiem, co pozwala zachować prosty i czysty interfejs Point. A twoje nazwy funkcji nie muszą mieć długich nazw, takich jak 'point_line_distance', ale można je po prostu nazwać" odległością ". – juanchopanza
Dopóki są one funkcjonalnie identyczne, wstawiłbym je jako element klasy liniowej tylko w celu zmniejszenia zależności między punktem i linią, zważywszy, że linia ma już zależność od punktu, nie ma powodu, aby wprowadzać odwrotność. – cppguy