Czy wywoływanie metody public w prywatnej metodzie tej samej instancji obiektu jest zapachem?
Czy wywoływanie metody public w prywatnej metodzie tej samej instancji obiektu jest zapachem?
Odpowiedzi:
Nie niezły zapach. Może to być potrzebne, dlaczego podejrzewasz, że to źle? Metoda na poziomie atomowym to niezależna jednostka, która wykonuje zadanie. Tak długo, jak wykonuje zadanie, każdy, kto ma do niego dostęp, może do niego zadzwonić, aby wykonać zadanie.
Zapach kodowy? Tak, niezbyt zły, ale dobry wskaźnik, że klasa może mieć zbyt wiele obowiązków.
Weź to za znak, że klasa może wymagać podziału na różne obiekty, prywatne metody nie powinny tak naprawdę wywoływać publicznych metod tego samego obiektu, z pewnością w czystym projekcie OO.
Oczywiście po sprawdzeniu klasy i wyjaśnieniu przyczyn wywołania metody może być to całkowicie rozsądne zastosowanie, ogólnie można oczekiwać, że metody użytkowe będą prywatne, ale jeśli jedna jest wystarczająco użyteczna, aby być publiczne i wykorzystywane przez inne metody, ogólnie oczekiwałbym, że te metody będą również publiczne.
Podobnie jak w przypadku wszystkich zapachów kodu, jest to motywacja do dalszej kontroli kodu, racjonalizacji i może refaktoryzacji, ale nie jest to powodem do niepokoju.
Może to prowadzić do nieprzyjemnych niespodzianek, jeśli ktoś, kto nie przeczytał kodu źródłowego tej klasy, spróbuje go podklasować i zastąpi metodę publiczną. To, czy jest to prawdziwy problem, oczywiście zależy od twojej sytuacji. Może powinieneś rozważyć uczynienie metody publicznej, a nawet ostatecznej klasy.
Nie. Co jeszcze należy zrobić w takim przypadku? Czy ustawić metodę prywatną jako publiczną czy metodę prywatną? Skopiuj-Wklej kod z metody publicznej do prywatnej?
NIE , tutaj nie ma nieprzyjemnego zapachu.
jeśli zaimplementujemy interfejs kolejki z Listą, czy nieprzyjemnym zapachem jest wywoływanie odpowiednich funkcji List w celu łatwego wdrożenia kolejki?
jeśli coś masz i chcesz go przekonwertować na coś innego (np. opakowanie), to nie jest to nieprzyjemny zapach, jego ponowne użycie kodu z wzorcem projektowym działało na poziomie funkcji (czy funkcja jest obiektem?)
Wiem, że to stary post, ale debatuję w pracy. Uważam to za zapach kodu i nie mogę zrozumieć, dlaczego miałbyś chcieć to zrobić. Jeśli metoda prywatna musi wywołać metodę publiczną, wówczas treść metody publicznej powinna zostać pobrana i umieszczona w metodzie prywatnej, którą następnie obie metody mogą wywołać. Czemu?
Metoda publiczna może zawierać testy, które nie są konieczne po wewnętrznym wykonaniu kodu. Może otrzymać UserObj i na przykład chcieć przetestować uprawnienia użytkownika.
Po publicznym wywołaniu może być konieczne zablokowanie obiektu, jeśli używasz wątków, więc wewnętrznie nie będziesz chciał odwoływać się do metody publicznej.
Moim zdaniem bardziej prawdopodobne jest wprowadzanie błędów okrągłych i nieskończonych pętli oraz wyjątków od memów.
Prosty i prosty, zły projekt i „leniwy”. Metody publiczne zapewniają dostęp do świata zewnętrznego. Nie ma powodu, aby wracać na zewnątrz, gdy już jesteś w środku.
Wyobraź sobie coś przeciwnego. Jesteś w prywatnej metody i trzeba funkcjonalność w sposób publiczny Co zrobić, jeśli nie mógł wywołać tę metodę publicznego z prywatnym jeden. Co byś zrobił?
Odpowiedź jest jednoznaczna: jeśli chcesz mieć funkcjonalność w metodzie publicznej, powinieneś być w stanie wywołać tę metodę z metod tej klasy lub z innych klas.
W moim kodzie często tworzę leniwe moduły ładujące, co oznacza, że obiekt jest inicjowany przy pierwszym żądaniu, a następnie ponownie wykorzystuje ten sam obiekt instancji. Jednak obiekt utworzony przy użyciu leniwego obciążenia sugeruje, że niekoniecznie musi zostać utworzony w dowolnym punkcie. Zamiast owijać głowę wokół sekwencji wywołań, tak że wiem, że ten obiekt jest już utworzony lub powtarzam ten sam kod leniwego obciążenia w innej metodzie, po prostu wywołuję leniwy moduł ładujący, gdy tylko potrzebuję tego obiektu.
Tak jak możesz inteligentnie korzystać z publicznych metod, możesz ich również używać niepoprawnie. Przykładem może być metoda publiczna, która przetwarza parametry przed wywołaniem innej metody prywatnej. Błędem byłoby wywoływanie tej publicznej metody zwyczajnie po prostu dlatego, że masz te same parametry. Błąd jest subtelny, ale jest to błąd projektowy bardziej niż cokolwiek innego i wymaga, abyś nauczył się radzić sobie z parametrami metody wewnętrznej, a nie parametrami metody publicznej.
Aby odpowiedzieć na twoje pytanie, z pewnością nie jest to zły kod, jeśli używasz go poprawnie.
Pytanie, które musisz sobie zadać, brzmi: dlaczego twoja klasa ma taką samą potrzebę jak jej klienci? Zazwyczaj klasa ma bardzo różne potrzeby od swoich klientów. Tak, to jest wskazówka, że masz albo
(a) ujawnił publicznie coś, co powinno być prywatne; lub
(b) zachowanie klasy nie jest wystarczająco wąskie (pomyśl o zasadzie pojedynczej odpowiedzialności).