2010-03-09 13 views
5

Piszemy SDK dla programu CAD i mamy niewielki spór dotyczący konkretnego typu funkcji (nie tylko nieporozumień pomiędzy różnymi osobami, ale także braku zgody między dwiema połówkami mózgu)..NET SDK problem, którą drogą iść?

Wyobraź sobie, że istnieje wiele klas dla określonych typów krzywych (elipsa, okrąg, łuk, linia, beziera itp.). Wszystkie te klasy mogą być reprezentowane przez krzywą Nurbs. Więc powinniśmy umieścić Circle-> funkcję NURBS w kółko:

public NurbsCurve Circle.ToNurbsCurve() 
{ 
    // Return a circular NurbsCurve or null if the Circle is invalid. 
} 

czy powinien to być statyczne NurbsCurve:

public static NurbsCurve NurbsCurve.CreateFromCircle(Circle) 
{ 
    // Return a circular NurbsCurve or null if the Circle is invalid. 
} 
+0

Jedną opcją są metody przedłużania. 'public static NurbsCurve ToNurbs (to koło Circle) {}' –

+2

@Chris, to naprawdę nie ma sensu tutaj ... to Circle wie, jak powinien to być konwerter do NurbsCurve, a nie do klasy NurbsCurve. Metody rozszerzeń są fajną funkcją, ale wiele osób (w tym ja) nadużywa ich. –

Odpowiedz

4

myślę, że pójdę do pierwszego (na przykład na zajęciach kształtu , może nawet ze wspólną klasą bazową lub interfejsem, takim jak IConvertibleToNurbsCurve), ponieważ ułatwia to dodawanie późniejszych kształtów, które również można zamienić na NurbsCurve.

Wydaje się, że NurbsCurve jest mniej wyspecjalizowany i dlatego nie powinien "wiedzieć" o bardziej wyspecjalizowanych typach IMHO.

+0

Dzięki Lucero. dobry punkt o dodawaniu kolejnych zajęć później. –

1

Chciałbym umieścić go w klasie Circle, bo to taki, który wie, jak należy go przekonwertować na NurbsCurve. Klasa NurbsCurve nie powinna wiedzieć o wszystkich określonych typach krzywych. W ten sposób, jeśli utworzysz nowy typ krzywej, nie będziesz musiał modyfikować klasy NurbsCurve.

BTW, proponuję zadeklarować metodę w interfejsie realizowanego przez wszystkich krzywych ToNurbsCurve (lub zadeklarować wirtualny w abstrakcyjnej klasy bazowej)

+0

Dzięki Thomas. Odnosząc się do komentarza Interface, mamy niestety wiele różnych funkcji ToXxxx(), więc używanie interfejsów dla wszystkich z nich stałoby się nieco nieporęczne. –

Powiązane problemy