Piszę zajęcia, które „muszą być używane w określony sposób” (chyba wszystkie klasy muszą…).
Na przykład, utworzyć fooManager
klasę, która wymaga połączenia do, powiedzmy Initialize(string,string)
. I, idąc dalej za przykładem, klasa byłaby bezużyteczna, gdybyśmy nie słuchali jej ThisHappened
akcji.
Chodzi mi o to, że klasa, którą piszę, wymaga wywołań metod. Ale skompiluje się dobrze, jeśli nie wywołasz tych metod i skończy się pustym nowym FooManager. W pewnym momencie albo nie zadziała, albo może się zawiesi, w zależności od klasy i tego, co robi. Programista, który implementuje moją klasę, oczywiście zajrzy do niej i zrozumie „Och, nie zadzwoniłem do Initialize!”, I byłoby dobrze.
Ale mi się to nie podoba. Idealnie chciałbym, aby kod NIE kompilował się, gdyby metoda nie została wywołana; Zgaduję, że to po prostu niemożliwe. Lub coś, co natychmiast byłoby widoczne i jasne.
Niepokoi mnie obecne podejście, które mam tutaj:
Dodaj prywatną wartość logiczną do klasy i sprawdzaj wszędzie, gdzie jest to konieczne, czy klasa została zainicjowana; jeśli nie, wyrzucę wyjątek z informacją: „Klasa nie została zainicjowana, czy na pewno dzwonisz .Initialize(string,string)
?”.
Takie podejście jest w porządku, ale prowadzi do kompilacji kodu i ostatecznie nie jest konieczne dla użytkownika końcowego.
Czasami jest to nawet więcej kodu, gdy jest więcej metod niż tylko Initiliaze
wywołanie. Staram się, aby moje zajęcia były prowadzone przy użyciu niezbyt wielu publicznych metod / działań, ale to nie rozwiązuje problemu, a jedynie utrzymuje rozsądek.
Szukam tutaj:
- Czy moje podejście jest prawidłowe?
- Czy jest lepszy?
- Co robicie / doradzacie?
- Czy próbuję rozwiązać problem? Koledzy powiedzieli mi, że programista powinien sprawdzić klasę, zanim spróbuje z niej skorzystać. Z szacunkiem się nie zgadzam, ale wierzę, że to kolejna sprawa.
Mówiąc prościej, próbuję znaleźć sposób, aby nigdy nie zapomnieć o implementacji wywołań, gdy ta klasa zostanie ponownie użyta później lub przez kogoś innego.
WYJAŚNIENIA:
Aby wyjaśnić wiele pytań tutaj:
Zdecydowanie NIE mówię tylko o części zajęć z Inicjalizacji, ale raczej o całym jej życiu. Zapobiegaj kolegom wywoływania metody dwa razy, upewniając się, że wywołują X przed Y itp. Wszystko, co skończyłoby się obowiązkiem i dokumentacją, ale chciałbym, żeby było to w kodzie, tak proste i małe, jak to możliwe. Bardzo podobał mi się pomysł Asserts, choć jestem pewien, że będę musiał wymieszać kilka innych pomysłów, ponieważ Asserts nie zawsze będą możliwe.
Używam języka C #! Jak o tym nie wspomniałem ?! Jestem w środowisku Xamarin i buduję aplikacje mobilne, zwykle wykorzystując około 6 do 9 projektów w rozwiązaniu, w tym projekty PCL, iOS, Android i Windows. Jestem programistą przez około półtora roku (szkoła i praca łącznie), stąd moje czasem śmieszne wypowiedzi / pytania. To chyba nie ma znaczenia, ale zbyt wiele informacji nie zawsze jest złą rzeczą.
Nie zawsze mogę umieścić w konstruktorze wszystko, co jest obowiązkowe, ze względu na ograniczenia platformy i użycie wstrzykiwania zależności, ponieważ parametry inne niż interfejsy są poza tabelą. A może moja wiedza nie jest wystarczająca, co jest wysoce możliwe. Przez większość czasu nie jest to kwestia inicjalizacji, ale więcej
jak mogę się upewnić, że zarejestrował się na tym wydarzeniu?
jak mogę się upewnić, że nie zapomniał „zatrzymać procesu w pewnym momencie”
Tutaj pamiętam zajęcia z pobierania reklam. Tak długo, jak widoczny jest widok reklamy, klasa co minutę pobiera nową reklamę. Ta klasa potrzebuje widoku, gdy jest skonstruowana w miejscu, w którym może wyświetlać reklamę, która może oczywiście zawierać parametr. Ale gdy widok zniknie, należy wywołać StopFetching (). W przeciwnym razie klasa nadal pobierałaby reklamy dla widoku, którego nawet tam nie ma, a to źle.
Ponadto w tej klasie znajdują się zdarzenia, które należy wysłuchać, na przykład „AdClicked”. Wszystko działa dobrze, jeśli nie jest słuchane, ale tracimy śledzenie danych analitycznych, jeśli krany nie są zarejestrowane. Reklama nadal działa, więc użytkownik i programista nie zobaczą różnicy, a dane analityczne będą po prostu mieć nieprawidłowe dane. Trzeba tego unikać, ale nie jestem pewien, skąd programista może wiedzieć, że musi zarejestrować się na wydarzeniu tao. Jest to jednak uproszczony przykład, ale istnieje idea „upewnij się, że korzysta z publicznej Akcji, która jest dostępna” i oczywiście w odpowiednim czasie!
initialize
należy wykonać późno po utworzeniu obiektu? Czy ctor byłby zbyt „ryzykowny” w tym sensie, że mógłby rzucać wyjątki i przerywać łańcuch tworzenia?
new
jeśli obiekt nie jest gotowy do użycia. Poleganie na metodzie inicjalizacji z pewnością będzie cię prześladować i powinno się jej unikać, chyba że jest to absolutnie konieczne, przynajmniej takie jest moje doświadczenie.