Jak zdecydujesz między przekazywaniem argumentów do metody a zwykłym deklarowaniem ich jako zmiennych instancji obiektu, które są widoczne dla wszystkich metod obiektu?
Wolę przechowywać zmienne instancji na liście na końcu klasy, ale lista ta wydłuża się wraz z rozwojem mojego programu. Wydaje mi się, że jeśli zmienna jest przekazywana wystarczająco często, powinna być widoczna dla wszystkich metod, które jej potrzebują, ale potem zastanawiam się, „jeśli wszystko jest publiczne, nie będzie w ogóle potrzeby przekazywania czegokolwiek!”.
Odpowiedzi:
Ponieważ odnosisz się do zmiennych instancji, zakładam, że pracujesz w języku zorientowanym obiektowo. Do pewnego stopnia to, kiedy używać zmiennych instancji, jak definiować ich zakres i kiedy używać zmiennych lokalnych, jest subiektywne, ale istnieje kilka praktycznych zasad, których można przestrzegać podczas tworzenia klas.
Zmienne instancji są zwykle uważane za atrybuty klasy. Pomyśl o nich jak o przymiotnikach przedmiotu, który zostanie utworzony z twojej klasy. Jeśli dane Twojej instancji mogą pomóc w opisaniu obiektu, prawdopodobnie można założyć, że jest to dobry wybór na przykład dane.
Zmienne lokalne są używane w ramach metod, aby pomóc im w zakończeniu pracy. Zwykle celem metody powinno być uzyskanie pewnych danych, zwrócenie niektórych danych i / lub przetworzenie / uruchomienie algorytmu na niektórych danych. Czasami warto pomyśleć o zmiennych lokalnych jako o sposobach pomagania metodzie w przejściu od początku do końca.
Zakres zmiennej instancji służy nie tylko do zapewnienia bezpieczeństwa, ale także do hermetyzacji. Nie zakładaj, że „celem powinno być zachowanie prywatności wszystkich zmiennych”. W przypadku dziedziczenia zwykle dobrą alternatywą jest oznaczanie zmiennych jako chronionych. Zamiast oznaczać wszystkie dane instancji jako publiczne, tworzysz metody pobierające / ustawiające dla tych, które muszą mieć dostęp do świata zewnętrznego. Nie udostępniaj ich wszystkich - tylko te, których potrzebujesz. Nastąpi to przez cały cykl rozwoju - trudno to odgadnąć od samego początku.
Jeśli chodzi o przekazywanie danych po klasie, trudno jest powiedzieć, że to, co robisz, jest dobrą praktyką bez zobaczenia kodu. Czasami działanie bezpośrednio na danych instancji jest w porządku; innym razem tak nie jest. Moim zdaniem jest to coś, co wiąże się z doświadczeniem - wraz z poprawą umiejętności myślenia obiektowego rozwiniesz intuicję.
źródło
Zależy to głównie od czasu życia danych przechowywanych w zmiennej. Jeśli dane są używane tylko podczas obliczeń, przekaż je jako parametr. Jeśli dane są powiązane z okresem istnienia obiektu, użyj zmiennej instancji.
Gdy lista zmiennych staje się zbyt długa, może warto pomyśleć o refaktoryzacji niektórych części klasy do nowej klasy.
źródło
Moim zdaniem zmienne instancji są potrzebne tylko wtedy, gdy dane będą używane w różnych połączeniach.
Oto przykład:
Teraz obrazowanie klasy myDrawing wykorzystuje 15 funkcji pomocniczych do tworzenia obiektu myCircle, a każda z tych funkcji będzie potrzebować środka i promienia. Nadal nie powinny być ustawiane jako zmienne instancji klasy myDrawing. Ponieważ już nigdy nie będą potrzebne.
Z drugiej strony klasa myCircle będzie musiała przechowywać zarówno środek, jak i promień jako zmienne instancji.
Aby obiekt myCircle wiedział, jaki jest jego promień i środek w momencie wykonywania tych nowych wywołań, muszą one być przechowywane jako zmienne instancji, a nie tylko przekazywane do funkcji, które ich potrzebują.
Zasadniczo zmienne instancji są więc sposobem na zapisanie „stanu” obiektu. Jeśli zmienna nie jest konieczna do poznania stanu obiektu, to nie powinna być zmienną instancji.
A jeśli chodzi o upublicznianie wszystkiego. W tej chwili może to ułatwić ci życie. Ale wróci, by cię prześladować. Proszę nie.
źródło
MOIM ZDANIEM:
Jeśli zmienna stanowi część stanu instancji, powinna to być zmienna instancji - classinstance HAS-A instancevariable.
Gdybym odkrył, że wielokrotnie przekazuję coś do metod instancji lub stwierdziłem, że mam dużą liczbę zmiennych instancji, prawdopodobnie spróbuję spojrzeć na mój projekt na wypadek, gdyby coś przeoczyłem lub gdzieś wykonałem złą abstrakcję.
Mam nadzieję, że to pomoże
źródło
Oczywiście łatwo jest zachować jedną dużą listę zmiennych publicznych w klasie. Ale nawet intuicyjnie można stwierdzić, że nie jest to właściwa droga.
Zdefiniuj każdą zmienną tuż przed jej użyciem. Jeśli zmienna obsługuje funkcję określonej metody, używaj jej tylko w zakresie tej metody.
Pomyśl także o bezpieczeństwie, publiczna zmienna klasy jest podatna na niepożądane zmiany z „zewnętrznego” kodu. Twoim głównym celem powinno być zachowanie prywatności wszystkich zmiennych, a każda zmienna, która nie jest, powinna mieć ku temu bardzo dobry powód.
Jeśli chodzi o przekazywanie parametrów przez całą górę stosu, może to bardzo szybko stać się brzydkie. Praktyczną zasadą jest zachowanie czystości i elegancji sygnatur metod. Jeśli widzisz wiele metod korzystających z tych samych danych, zdecyduj, czy wystarczająco ważne jest, aby być członkiem klasy, a jeśli nie, zrefaktoryzuj kod, aby miał więcej sensu.
Sprowadza się do zdrowego rozsądku. Zastanów się dokładnie, gdzie i dlaczego deklarujesz każdą nową zmienną, jaka powinna być jej funkcja, a następnie podejmij decyzję, w jakim zakresie ma ona żyć.
źródło