2014-07-21 17 views
6

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?

+0

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

+0

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

+0

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

Odpowiedz

4

Twoja trzecia opcja z innego miejsca, które nie jest w klasie Point lub Line, jest najlepszą opcją.

Points nie powinien wiedzieć o Lines i odwrotnie. W przeciwnym razie będą ściśle powiązane.

http://en.wikipedia.org/wiki/Loose_coupling

Jednak nie może być jakaś inna klasa, która wie o obu.

W języku Java prawdopodobnie utworzyłem trzecią klasę Distance lub DistanceCalculator, która może obliczyć odległości między kilkoma obiektami.

Distance.between(Point a, Point b) 

Distance.between(Point a, line l) 

itp

+0

Nie ma potrzeby korzystania z klasy, chyba że używasz języka, który nie ma funkcji nie należących do grupy. – juanchopanza

1

w Javie zawsze można stworzyć wolną funkcję stałego jako metody statycznej jednej z dwóch klas (lub trzeciej klasy pomocnika).

Nie wydaje mi się, że istnieje ogólnie preferowany sposób, ale można mieć wszystkie trzy dla większej elastyczności i ponownie użyć kodu.

Na przykład, jedna metoda będzie posiadać logikę:

class Point { 
... 
    float distToLine (Line l) { 
     .... 
     return some result; 
    } 
... 
} 

a następnie inne metody wezwie oryginalną metodę:

class Line { 
... 
    float distToPoint (Point p) { 
     return p.distToLine (this); 
    } 
... 
    static float pointToLineDistance (Point p, Line l) { 
     return p.distToLine (l); 
    } 
... 
} 
0

Czwartą opcją jest znalezienie/budowę wspólnego przodka w hierarchii klas, która może być czymś w rodzaju "GeometricEntity". Wszystko, co ma znaczenie "odległość do annother GeometricEntity".