Co powiedzieć swojemu szefowi, jeśli chce, abyś użył zmiennej globalnej

13

Jestem obecnie 4 miesiące na stażu, a podczas przeglądania mojego kodu mój szef nie spodobał się, że trzymałem konkretny obiekt lokalnie dla wielu metod w kilku oddzielnych klasach w ramach jednego zestawu. Nie podobało mu się, że za każdym razem tworzyłem nowy obiekt, a zamiast tego kazałem stworzyć jeden obiekt, do którego można uzyskać dostęp z dowolnego miejsca. Musiałem więc stworzyć go jako obiekt statyczny w klasie statycznej i po prostu odwołać się do tego tutaj, chcę go użyć!

Jak sobie z tym poradzisz, ponieważ programuję profesjonalnie dopiero od 4 miesięcy!

Darren Young
źródło
4
Czy twój szef jest osobą techniczną czy nietechniczną? Jeśli jest techniczny, czy przeczytał „Czysty kod” Roberta C. Martina?
George Stocker,
5
Twój szef zatrudnił cię do kodowania, a teraz mówi ci, jak kodować?
Jeremy Heiler
8
Powiedziałeś w komentarzu poniżej, że „obiekt nie ma żadnego stanu poza wieloma stałymi”. W takim przypadku klasa statyczna wydaje mi się dobrym rozwiązaniem.
Justin
5
„Yes Boss”
2
„kazał mi stworzyć pojedynczy obiekt, do którego można uzyskać dostęp z dowolnego miejsca. Dlatego musiałem go stworzyć jako obiekt statyczny” To nie jest uzasadnione rozumowanie. Mówisz tak, jakby jeden obiekt dostępny z całej aplikacji sugerował, że masz Singletona - dlaczego nie utworzysz go w katalogu głównym agregacji, a następnie przekażesz jego odwołanie klasom zależnym?
pożarł elysium

Odpowiedzi:

33

Jeśli wystarczy jeden obiekt, tworzenie go za każdym razem jest marnotrawstwem, a tutaj szef może mieć rację.

Problemem jest właściwy dostęp do tego obiektu. Metoda przypominająca fabrykę z odpowiednią widocznością, która zawsze zwraca ten nieruchomy obiekt, jest pierwszym rozwiązaniem, które przychodzi na myśl. Inne z pewnością istnieją.

9000
źródło
3
+1: tak bardzo, jak mi się nie podoba odpowiedź „tak powiedział GoF”, prawda ma rację.
Javier
1
Myślałem o Singletonach, ale po prostu widziałem to jako opakowanie wokół zmiennej globalnej, więc nie podążyłem za nim. Spróbuję teraz, ponieważ obiekt nie ma żadnego stanu, oprócz wielu stałych, więc powinno być dobrze. Dzięki.
Darren Young,
9
Podejrzewałem, że może tak być („obiekt nie ma żadnego stanu ... wiele stałych”). Twój szef ma rację. Nie ma sensu wywierać sztucznego nacisku na moduł wyrzucania śmieci w celu uzyskania wartości, które nigdy się nie zmieniają.
Berin Loritsch,
3
@ darren-young: na marginesie, brak stanu jest interesujący i pozwala na pewne potężne podejścia; spójrz na tak zwane „programowanie funkcjonalne”, jeśli jeszcze tego nie zrobiłeś.
9000
8

Nie mogę skomentować twojego konkretnego przypadku, ale użycie zmiennych globalnych jest czasem dobrym rozwiązaniem. Klasa systemowa Java jest pełna statycznych zmiennych globalnych.

Ale ogólnie, jeśli uważasz, że masz rację, a twój szef się myli, to dlaczego nie poprosisz szefa o wyjaśnienie, dlaczego uważa, że ​​zmienna globalna jest lepszym rozwiązaniem? Proste „nie podoba mi się” jest tak niejasne, jak „zmienne globalne są złe”. Musisz wymagać więcej od swojego szefa!

Jeśli nie może podać powodów swojej postawy, a ty możesz podać przyczyny swojej postawy lub odwrotnie, to jest to dobra okazja do nauki. Jeśli oboje potraficie uzasadnić swoje stanowisko, to prawdopodobnie jest to kwestia gustu - lub doświadczenia: twój szef musiał programować profesjonalnie dłużej niż 4 miesiące, tak myślę?

Joonas Pulakka
źródło
1
Widzisz, java.lang.Systemzawiera dokładnie trzy zmienne globalne, a dla każdej z nich istnieje metoda prawidłowego ustawienia. Ale Systemjest pełen metod statycznych, które zwracają obiekty globalne, i nie ma w tym nic złego, nie można się kłócić.
9000
2
Tak; Uważam zmienne globalne za bardzo podobne do metod statycznych, które zwracają obiekty globalne.
Joonas Pulakka
Java to robi. Jest to inna kwestia całkowicie od tego, czy to dobry pomysł. Standardowy generator liczb losowych C zachowuje stan globalny. Ale powszechnie uznaje się, że jest to okropne i dlatego generator liczb losowych jest zatem nieużyteczny w niektórych aplikacjach (patrz np. Bentley i in., Inżynieria funkcji sortowania ). W szczególności Java ma wiele problemów projektowych (które zostały częściowo poprawione w C #), więc nie będę bardzo ostrożny, używając tego jako argumentu takiego jak ten.
Konrad Rudolph
@Konrald Rudolph: Ostatecznie jest to decyzja projektowa. Każda decyzja ma zalety i wady. Na przykład utrzymanie stanu globalnego Systemupraszcza, powiedzmy, 99,9% przypadków użycia kosztem powodowania problemów w pozostałych 0,1%. Nie ma „właściwej” odpowiedzi na pytanie, czy 0,1% jest warte dodatkowej złożoności.
Joonas Pulakka
5

Jako ktoś na twoim stanowisku możesz jedynie uczyć się. Jeśli obiekt jest zasadniczo stały (tzn. Nie może się zmienić i nie utrzymuje stanu), to twój szef może mieć rację. Posiadanie stałego obiektu statycznego nie szkodzi. W końcu ile jest definicji PI?

Niektórzy bronią sposobu myślenia „bez obiektów globalnych” aż do religijnej żarliwości. Jest to z jednego z dwóch powodów: trudniej było im wyśledzić błędy lub niestabilność systemu z powodu nadużywania globalnych zmiennych / obiektów, lub słyszeli, że to źle i nie mogą sami myśleć. Osobiście należę do grupy osób, które zostały mocno dotknięte kruchością i trudnością w wykrywaniu błędów - ale nauczyłem się tutaj również pewnej równowagi.

Gdybym był w twoich butach, zrobiłbym to, co mówi szef - w końcu to jego tyłek na linii. Potem oglądam i widzę efekty tego wyboru w czasie. To skuteczne narzędzie do nauki.

Berin Loritsch
źródło
To staż. Powinieneś się uczyć. Ślepe robienie tego, co mówi szef, nie jest nauką.
David Thornley,
5
Ani też ślepo nie zmierzy się z twoim szefem. Moja rada, jak napisano, polegała na obserwacji skutków wyboru szefa. My (podczas wymiany stosów) nie jesteśmy w stanie ocenić wartości sytuacji, ponieważ brakuje nam istotnych informacji. Jest to przypadek zrobienia trochę naukowej metody. OP ma hipotezę, szef ją podważył. Czas wykonać eksperyment.
Berin Loritsch,
2

W zależności od konkretnej sytuacji zmienna globalna może być najlepszym rozwiązaniem. W programowaniu wbudowanym globale nie zajmują miejsca na stosie i dlatego jest to dobry wybór.

Globals czy nie, uważam, że dobrą praktyką jest umieszczanie prefiksu na globals. To sprawi, że inni programiści będą googlować twój kod, wiedząc o wpływie bałaganu.

Max Kielland
źródło