Obecnie pracuję nad bazą kodu, która ma wiele klas, które implementują metodę Start. Wydaje mi się to konstrukcją dwufazową, co zawsze uważałem za złą praktykę. Nie umiem odróżnić tego od konstruktora.
Kiedy należy zastosować metodę początkową zamiast normalnej konstrukcji obiektu?
Kiedy powinienem używać konstruktora?
Edycja: Nie sądzę, że jest to tak istotne, ale językiem programowania jest C #, może on również mieć zastosowanie do Java lub C ++
object-oriented-design
construction
constructors
Dave Hillier
źródło
źródło
start
a konstruktorem? itd ...init
metody pozanew
funkcją - perldoc.perl.org/perlobj.html . Idiomy jednego języka mogą tam dobrze działać, a nie w innych językach.Start
metodami we wspólnych interfejsach API obejmują wątki i stopery.Odpowiedzi:
Start()
Sposób (jakRun()
,Execute()
lub coś podobnego) jest odpowiedni, gdy koszt budowy obiekt jest niska, a koszty stosując jest wysoki. Na przykład: Klasa, która zawiera algorytm optymalizacji najlepszej ścieżki. Ustawienie go z zestawem parametrów (X
kwadraty zaY
kwadraty, przy użyciu takiej metody oceny) jest trywialne , ale wykonanie może zająć trochę czasu. Jeśli chcesz utworzyć 20 takich obiektów, możesz opóźnić wykonanie, aż wszystkie zostaną utworzone - pozwala to na przykład łatwiej zrównoleglić je.Alternatywnie może być przydatny, gdy nie wiesz, kiedy obiekt będzie potrzebny do uruchomienia - być może dlatego, że jest oparty na danych wejściowych użytkownika lub logice, która wybiera z listy możliwości.
Zakłada się oczywiście, że
Start()
jest to użyteczna metoda na obiekcie, a nie odpowiednikInitialize()
metody. Jeśli jest to dodatkowy sposób na ustawienie większej liczby parametrów, nie powinien istnieć.źródło
Code Complete (i wiele innych zasobów inżynierii oprogramowania) kładzie nacisk na dopasowanie twoich klas do rzeczywistych obiektów. Uważam, że podstawową przyczyną tego jest fakt, że bardziej prawdopodobne jest, że naprawdę rozumiesz, co wdrażasz, niż przekłamywanie nienamacalnego pomysłu.
Jeśli jesteś subskrybentem tej teorii, nie widzę nic złego w dodawaniu
Start()
metody do dowolnej klasy, która powinna, gdyby był to prawdziwy obiekt, również mieć stan spoczynku. Jeśli nie ma sensu istnienie obiektu podczas jego działania (lub w ogóle nie ma sensu, aby obiekt działał), powiedziałbym, że jest to zła praktyka.źródło
Start()
może on odpowiadać albo włącznikowi / wyłącznikowi (jak włącznik światła), który powinien następnie mieć przyciskStop()
, lub przyciskowi (jak przycisk Drukuj na kserokopiarce), gdzie uruchamia się, a następnie uruchamia, aż do zakończenia.Możesz użyć leniwej inicjalizacji.
W ten sposób unikasz łączenia czasowego, co oznacza, że konsument twojej klasy musi wywoływać określone metody w określonej kolejności.
start()
Najpierw musisz zadzwonić , aby dowiedzieć się, jak działa klasa, co jest złe, ponieważ możesz to zmienić w przyszłości.Opóźnij kosztowną inicjalizację, dopóki nie będzie potrzebna.
Przykład:
źródło