Jaka praktyka programistyczna, którą kiedyś lubiłeś, odkąd zmieniłaś zdanie? [Zamknięte]

99

Podczas programowania wszyscy rozwijamy praktyki i wzorce, których używamy i na których polegamy. Jednak z biegiem czasu, gdy zmienia się nasze zrozumienie, dojrzałość, a nawet wykorzystanie technologii, zdajemy sobie sprawę, że niektóre praktyki, które kiedyś uważaliśmy za świetne, nie są (lub już nie mają zastosowania).

Przykładem praktyki, której kiedyś używałem dość często, ale w ostatnich latach uległa zmianie, jest użycie wzorca obiektu Singleton .

Na podstawie własnego doświadczenia i długich debat z kolegami zdałem sobie sprawę, że singletony nie zawsze są pożądane - mogą utrudniać testowanie (hamując techniki takie jak kpiny) i mogą tworzyć niepożądane sprzężenia między częściami systemu. Zamiast tego używam teraz fabryk obiektów (zwykle z kontenerem IoC), które ukrywają naturę i istnienie singletonów przed częściami systemu, których to nie obchodzi - lub które muszą wiedzieć. Zamiast tego polegają na fabryce (lub lokalizatorze usług), aby uzyskać dostęp do takich obiektów.

Moje pytania do społeczności, w duchu samodoskonalenia, są następujące:

  • Jakie wzorce lub praktyki programistyczne rozważaliście ostatnio, a teraz staracie się unikać?
  • Czym zdecydowałeś się je zastąpić?
LBushkin
źródło

Odpowiedzi:

159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.


Luke Baulch
źródło
+1. Miałem zamieścić tę samą odpowiedź. Kilka tygodni temu znalazłem część moich starych zadań programistycznych na płycie archiwum. Wszystko wyglądało tak samo. Stosunek wierszy komentarzy do wierszy kodu był prawie 1: 1.
Michael Moussa,
32
Wygląda na to, że niepoprawnie skomentowałeś , nie za dużo. Kod nie mówi sam za siebie. Nie. Naprawdę nie. Przeczytaj najnowszy NT Insider, aby uzyskać dobrą opinię na ten temat. Jeśli uważasz, że komentarze będą zbędne, to albo się mylisz, albo robisz to źle. Uniwersytety nie uczą poprawnego komentowania, jak się wydaje (ani śledzenia błędów lub kontroli wersji ... * westchnienie *). Jest o wiele za mało komentarzy. (i mniej dobrych)
Thomas
5
Code Complete zawiera dobre wskazówki dotyczące komentowania i danych do tworzenia kopii zapasowych.
Thomas,
20
Komentarze powinny być używane do opisania, dlaczego kod robi to, co robi (jeśli nie jest to oczywiste), a nie co robi kod. Możliwym wyjątkiem jest zwariowana bitwa i hackowanie języka, jak magiczna liczba 0x5f3759df Carmacka.
Chris Simmons,
6
@ Thomas: Osobiście uważam, że problem polega na tym, że uczenie dobrego komentowania nie jest czymś, co uniwersytet może pokazać studentom. Prawie wszystkie programy w szkołach to rzeczy jednorazowe; uczniowie nie mają doświadczenia w spoglądaniu wstecz na kod, który napisali rok temu iw ogóle go nie rozumieją. Ponadto na niższych poziomach uczą się naprawdę prostych koncepcji kodowania - komentowanie na tym poziomie jest prawie zawsze uciążliwe ze względu na to, co się dzieje. Innymi słowy, to tak, jakby próbować nauczyć kogoś pływać w brodziku; po prostu nie jest to właściwy kontekst dla zrozumienia tych ruchów.
Dan Lew,
117

Pojedyncze punkty zwrotne.

Kiedyś wolałem jeden punkt zwrotny dla każdej metody, ponieważ dzięki temu mogłem zapewnić, że żadne czyszczenie wymagane przez rutynę nie zostanie przeoczone.

Od tego czasu przeszedłem do znacznie mniejszych procedur - więc prawdopodobieństwo przeoczenia czyszczenia jest zmniejszone, a potrzeba czyszczenia jest zmniejszona - i stwierdziłem, że wczesne zwroty zmniejszają pozorną złożoność (poziom zagnieżdżenia) kodu. Artefakty pojedynczego punktu powrotu - utrzymywanie zmiennych „wynikowych” w pobliżu, przechowywanie zmiennych flag, klauzule warunkowe dla sytuacji, które nie zostały jeszcze wykonane - sprawiają, że kod wydaje się znacznie bardziej złożony niż jest w rzeczywistości, czyniąc go trudniejszym do odczytania i utrzymania. Wczesne wyjścia i mniejsze metody są do zrobienia.

Carl Manaster
źródło
3
Zgadzam się, w połączeniu z typami danych, które automatycznie się oczyszczają, takimi jak autoptr, scoped_ptr, CComPtr itp.
i_am_jorf
3
Porządkowanie
@banjollity: z wyjątkiem języków, które ostatecznie nie są obsługiwane {}. I pamiętaj, że nawet w językach, które go obsługują, ostatecznie {} nie jest ZAWSZE gwarantowane do wykonania.
Chris K,
1
@banjollity, Chris: W C ++, czyszczenie jest tym, do czego służy destruktor, i z wyjątkiem ekstremalnych okoliczności (exit (), destruktor rzucający wyjątek podczas rozwijania stosu, wiewiórki ograniczające moc) gwarantuje to działanie.
David Thornley
4
Zgoda. Zastąp zagnieżdżone warunkowe klauzule ochronne ftw!
Jonik
111
  • Próba perfekcyjnego kodowania rzeczy za pierwszym razem.
  • Próba stworzenia idealnego modelu OO przed kodowaniem.
  • Projektowanie wszystkiego pod kątem elastyczności i przyszłych ulepszeń.

Jednym słowem przepracowanie .

wuub
źródło
6
Czekaj, zawsze mi się uda za pierwszym razem. :)
i_am_jorf
18
Prawdziwe pieniądze to subtelny błąd za pierwszym razem i wypuszczenie go na wolność. Następnie, gdy ludzie przyzwyczają się do wersji wzmocnionej, wkrocz z aroganckim showmanem i napraw błąd / nieefektywność, aby uzyskać dodatkową chwałę! ;)
Eric
7
@jeffamaphone - Nie, tylko Jon Skeet robi to dobrze za pierwszym razem.
Jordan Parmer,
Podoba mi się słowo „nadmierna inżynieria”
Neilvert Noval
@jeffamaphone - zawsze mi się to udaje za pierwszym razem. Ale dalsze próby dają to, czego potrzebuję :)
umbr
78

Notacja węgierska (zarówno formy, jak i systemy). Kiedyś wszystko poprzedzałem. strSomeString lub txtFoo. Teraz używam someString i textBoxFoo. Jest znacznie bardziej czytelny i łatwiejszy do przyjścia i odebrania przez kogoś nowego. Dodatkową korzyścią jest to, że zachowanie spójności jest trywialne - camel Umieść kontrolkę i dodaj użyteczną / opisową nazwę. Forms Hungarian ma tę wadę, że nie zawsze jest konsekwentny, a Systems Hungarian niewiele daje. Dzielenie wszystkich zmiennych razem nie jest zbyt przydatne - szczególnie w przypadku nowoczesnych IDE.

Kenny Mann
źródło
A co z językami dynamicznie typowanymi, takimi jak Python lub JavaScript? Nadal uważam, że pomocne jest używanie notacji węgierskiej w tych językach, aby patrząc na zmienne wiedzieć, jakiego typu zmiennej się spodziewać (jeśli jest typu, którego można się spodziewać - oczywiście byłoby nierozsądne traktować język z dynamicznym typowaniem dokładnie jak język typowany statycznie.)
Dan Lew,
4
Robię podobnie, z wyjątkiem: fooTextBox i stringów są po prostu, miejmy nadzieję, widoczne: numberOfEntries => int, isGreat => bool itp.
rball
+1 za pozbycie się notacji węgierskiej. Zgadzam się z rball; fooTextBox, fooService, fooString, gdy jest to naprawdę konieczne.
blu
3
@ wuub: Twierdziłbym, że przy odpowiednim nazewnictwie nie powinno być potrzeby niczego poprzedzać.
Kenny Mann,
4
Nawiasem mówiąc, to, o czym wspomniałeś, nie jest prawdziwym węgierskim.
Antony Carthy,
67

Architektura „doskonała”

architekturę wymyśliłem kilka lat temu. Posunąłem się technicznie tak daleko, jak mogłem, więc było 100% luźno powiązanych warstw, szerokie wykorzystanie delegatów i lekkie obiekty. To było techniczne niebo.

I to było bzdury. Czystość techniczna architektury po prostu spowolniła mój zespół programistów w dążeniu do doskonałości nad wynikami i prawie osiągnąłem całkowitą porażkę.

Mamy teraz znacznie prostszą, mniej technicznie doskonałą architekturę, a nasz współczynnik dostaw gwałtownie wzrósł.

Bruce McLeod
źródło
57

Zastosowanie kafiny. Kiedyś nie dawało mi to zasnąć i był we wspaniałym nastroju programowania, w którym kod leciał z moich palców z gorączkową płynnością. Teraz nic nie robi, a jeśli go nie mam, boli mnie głowa.

Alex
źródło
55
Musisz pić jeszcze więcej kawy. Jeśli to nie zadziała, zacznij palić.
MusiGenesis,
7
Brad: Nie potrzebujesz ich, jeśli masz Pythona: xkcd.com/353
Peter,
Niezła świąteczna historia! :-)
Steve Echols
2
Zerwałem z nałogu, a potem podniosłem go ponownie, kilka razy (to teraz mój trzeci cykl). Nie ma to jak kodowanie w zimne poranki z ciepłym kubkiem kawy!
Matthew Iselin,
15
„Wygląda na to, że wybrałem zły tydzień na rzucenie amfetaminy”.
ShreevatsaR
50

Komentowanie kodu. Kiedyś myślałem, że ten kod jest cenny i nie można po prostu usunąć tych pięknych klejnotów, które stworzyłeś. Usuwam teraz każdy skomentowany kod, który napotkam, chyba że jest dołączone TODO lub NOTE, ponieważ jest zbyt niebezpieczne, aby je zostawić. To znaczy, natknąłem się na stare klasy z ogromnymi zakomentowanymi częściami i naprawdę pomyliłem się, dlaczego one były: czy zostały niedawno skomentowane? czy to zmiana środowiska deweloperskiego? dlaczego robi ten niepowiązany blok?

Poważnie rozważ nie komentowanie kodu i po prostu jego usunięcie. Jeśli tego potrzebujesz, nadal podlega kontroli źródła. YAGNI chociaż.

brązowy
źródło
6
Komentuję stary kod podczas refaktoryzacji, ale tylko do czasu sprawdzenia, czy kod zastępczy działa. Gdy nowa wersja jest już w pełni funkcjonalna, usuwam stare skomentowane wiersze.
muusbolla
Owszem - również wykomentowuję kod, ale tylko na kilka dni. Jeśli wrócę i zdam sobie sprawę, że coś przegapiłem, zostanie usunięte, zanim nowy kod zostanie opracowany.
Colin Mackay,
4
Mówię, że raz sprawdź skomentowany kod, a następnie go usuń. Wiele razy testujesz różne fragmenty kodu i nie chcesz sprawdzać zepsutego kodu ...
DisgruntledGoat
Nie wspominając o tym, że kontrola wersji to twój przyjaciel.
David Thornley
+1 Pracowałem z programistą, który nalegał na skomentowanie całego kodu, który przerobił lub przepisał. Doprowadziłoby mnie to do szału, ponieważ czasami musiałem przewijać ponad 1k linii bzdur, aby znaleźć to, nad czym pracuję.
Evan Plaice,
46

Nadużywanie / nadużywanie dyrektyw #region. To drobiazg, ale w C # poprzednio używałem dyrektyw #region w każdym miejscu do organizowania moich zajęć. Na przykład zgrupowałbym wszystkie właściwości klas razem w regionie.

Teraz spoglądam wstecz na stary kod i głównie go denerwują. Nie sądzę, aby to naprawdę przez większość czasu wyjaśniało sytuację, a czasami po prostu spowalniało. Więc teraz zmieniłem zdanie i czuję, że dobrze rozplanowane klasy są w większości czystsze bez dyrektyw regionalnych.

Scott Ferguson
źródło
31
Nienawidzę regionów. Ludzie w moim zespole używają ich frywolnie. Nazywam ich „ukrywaczami złego kodu”.
rball
9
To zdecydowanie zapach kodu.
Frank Schwieterman
3
NIENAWIDZĘ regionów. Obecnie utrzymuję kod, w którym funkcja ma prawie 500 wierszy, a aby nim zarządzać, inteligentny programista umieścił fragmenty kodu w 10 do 15 regionach.
Rozwiązanie
6
@Solution Yogi: Nie sądzę, żeby regiony były prawdziwym problemem w twoim przypadku :-)
Ed S.
9
Myślę, że regiony mogą być w porządku, jeśli są używane oszczędnie.
Gregory Higley
39

Rozwój kaskadowy w ogóle, a w szczególności, praktyka pisania kompletnych i kompleksowych specyfikacji funkcjonalnych i projektowych, które w jakiś sposób mają być kanoniczne, a następnie oczekuje się, że ich implementacja będzie poprawna i akceptowalna. Widziałem, jak zastąpiono go Scrumem i powiem, że pozbyłem się go. Prosty fakt jest taki, że zmieniający się charakter potrzeb i pragnień klientów sprawia, że ​​każda ustalona specyfikacja jest faktycznie bezużyteczna; jedynym sposobem, aby naprawdę właściwie podejść do problemu, jest podejście iteracyjne. Oczywiście Scrum nie jest srebrną kulą; Wiele razy widziałem to nadużywane i nadużywane. Ale to bije wodospad.

Paul Sonier
źródło
3
Powiedz to mojemu klientowi ... Jestem w trakcie pisania jakiegoś bezużytecznego dokumentu specyfikacji: „Jestem programistą z kryształową kulą, więc wiem dokładnie, jak mój projekt niskopoziomowy będzie wyglądał za 6 miesięcy” :)
Igor Brejc
36

Nigdy się nie rozbija.

Wydaje się, że to dobry pomysł, prawda? Użytkownicy nie lubią programów, które ulegają awariom, więc piszmy programy, które się nie psują, a użytkownicy powinni lubić ten program, prawda? Tak zacząłem.

Obecnie jestem bardziej skłonny myśleć, że jeśli to nie działa, nie powinno udawać, że działa. Awaria tak szybko, jak to możliwe, z dobrym komunikatem o błędzie. Jeśli tego nie zrobisz, twój program będzie się zawieszał jeszcze mocniej, zaledwie kilka instrukcji później, ale z jakimś nieokreślonym błędem pustego wskaźnika, którego debugowanie zajmie Ci godzinę.

Mój ulubiony wzorzec „zapobiegaj awariom” to:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

Teraz zamiast prosić użytkowników o skopiowanie / wklejenie komunikatu o błędzie i wysłanie go do Ciebie, będziesz musiał zagłębić się w dzienniki, próbując znaleźć wpis dziennika. (A ponieważ wprowadzili nieprawidłowy identyfikator użytkownika, nie będzie wpisu w dzienniku).

gustafc
źródło
Jakie jest prawdopodobieństwo, że użytkownik wyświetli rzeczywisty komunikat o błędzie, w porównaniu z tym, że problem wystąpi w dziennikach? (W tym konkretnym przypadku bardzo niski, ale użytkownicy prawie nigdy nie cytują komunikatów o błędach!) Czy w ogóle je czytają?
Arafangion,
1
Przyznaję, że szansa, że ​​losowy użytkownik wyśle ​​Ci komunikat o błędzie, jest niewielka, ale jest ona niezerowa (trywialny przykład: czasami używasz własnej aplikacji), a niektórzy użytkownicy z czasem uczą się, co skopiować / wkleić. Nie mówię, że nie powinieneś logować (powinieneś), ale kiedy aplikacja jest zepsuta, jest zepsuta. Pokazywanie komunikatu o błędzie jest o wiele lepsze, dużo bardziej uczciwe dla użytkownika niż udawanie, że imię użytkownika to „błąd komunikacji z bazą danych” (lub co gorsza, nulllub pusty ciąg znaków).
gustafc
W drugiej linii występuje
wyjątek
Dzięki, naprawiłem to. (Chociaż było z nim trochę bardziej zabawnie: cały ten problem, aby uniknąć wyjątków i innych "awarii", a mimo to bezwarunkowo się
zawiesił
33

Pomyślałem, że sensowne jest stosowanie wzorców projektowych, gdy tylko je rozpoznałem.

Nie wiedziałem, że faktycznie kopiuję style z obcych języków programowania, podczas gdy język, z którym pracowałem, pozwalał na znacznie bardziej eleganckie lub łatwiejsze rozwiązania.

Używanie wielu (bardzo) różnych języków otworzyło mi oczy i uświadomiło mi, że nie muszę źle stosować rozwiązań innych ludzi do problemów, które nie są moje. Teraz wzdrygam się, gdy widzę wzór fabryczny zastosowany w języku takim jak Ruby.

molf
źródło
2
Proszę wybaczyć moją nieznajomość rubinu, ale dlaczego nie mielibyśmy używać w nim wzoru fabrycznego?
Mike Chamberlain
Nie jest to rubista, ale fabryka ma unikać polegania na implementacji, ale ruby ​​jest dynamiczny i możesz kpić lub odgrywać wszystko. Więc tak naprawdę nie polegasz na implementacji.
Stéphane,
27

Testy obsesyjne. Byłem zaciekłym zwolennikiem rozwoju najpierw testowego. W przypadku niektórych projektów ma to duży sens, ale zdałem sobie sprawę, że niewolnicze trzymanie się doktryny pisania testów jednostkowych dla każdego elementu funkcjonalności jest nie tylko niewykonalne, ale wręcz szkodliwe dla wielu projektów.

Naprawdę niewolnicze trzymanie się wszystkiego może być szkodliwe.

yalestar
źródło
22
Działa całkiem nieźle w przypadku wąsonogów.
MusiGenesis,
Pokrycie testów musi być proporcjonalne do korzyści. Wszystko, co robisz, naprawdę musi przynosić korzyści. 100% pokrycia nie da Ci tego wszystkiego. różnica od 80 lub 90 w formie, która nie jest w scenariuszu podtrzymywania życia / wystrzeliwania pocisków.
Spence,
+1 poleganie na testach jednostkowych w przeciwieństwie do testowania.
Preet Sangha,
25

To drobiazg, ale: dbanie o to, gdzie są nawiasy klamrowe (w tym samym czy następnym wierszu?), Sugerowane maksymalne długości wierszy kodu, konwencje nazewnictwa zmiennych i inne elementy stylu. Przekonałem się, że wszystkim zależy na tym bardziej niż mnie, więc po prostu idę z prądem każdego, z kim obecnie pracuję.

Edycja: Wyjątek od tej istoty, oczywiście, kiedy to ja najbardziej zależy mi na tym (lub to ja jestem w stanie ustawić styl dla grupy). W takim razie robię, co chcę!

(Zauważ, że to nie to samo, co brak spójnego stylu. Myślę, że spójny styl w bazie kodu jest bardzo ważny dla czytelności).

Daniel Lew
źródło
5
Ktoś dał temu głos przeciw, ale myślę, że to praktyczna perspektywa. Jaki jest najlepszy styl kodu? Nieważne. Spójrz w górę iw dół w tym samym pliku i zduplikuj.
Frank Schwieterman
12
Najlepsza stylizacja kodu jest zgodna ze standardem tego sklepu.
David Thornley,
Dlatego uwielbiam opcje automatycznego formatowania w programie Visual Studio. Nie ma znaczenia, jak inni programiści napisali kod. Po prostu wykonuję szybki format i dokładnie tak, jak mi się podoba ... przez większość czasu.
corymathews
5
@cory: czy to nie psuje możliwości twojego oprogramowania do kontroli wersji, aby pokazać różnicę między wersjami pliku, który właśnie sformatowałeś?
Steve Melnikoff
Dlatego właśnie pociąga mnie nauka Pythona ... pomyśleć, że muszę się tylko martwić o to, do czego są ustawione moje tabstop, a nie o ich style. To trochę fascynujące.
Chris K,
24

Być może najważniejszą „praktyką programistyczną”, na temat której zmieniłem zdanie, jest przekonanie, że mój kod jest lepszy od wszystkich innych. Jest to typowe dla programistów (zwłaszcza początkujących).

Nippizaurus
źródło
20

Biblioteki narzędziowe. Kiedyś nosiłem zespół z różnymi metodami pomocniczymi i klasami z teorią, że mógłbym ich kiedyś użyć gdzie indziej.

W rzeczywistości właśnie stworzyłem ogromną przestrzeń nazw z wieloma źle zorganizowanymi fragmentami funkcjonalności.

Teraz po prostu zostawiam je w projekcie, w którym je stworzyłem. Najprawdopodobniej nie będę tego potrzebować, a jeśli to zrobię, zawsze mogę je później przerobić na coś do ponownego wykorzystania. Czasami oznaczam je za pomocą // TODO w celu ewentualnego wyodrębnienia do wspólnego zestawu.

JamesWampler
źródło
12
Jest dobry cytat (w tej chwili nie mogę znaleźć oryginału), który brzmiał następująco: „Nawet nie myśl o tworzeniu ogólnej procedury, dopóki nie będziesz musiał rozwiązać tego samego problemu 3 razy.”
DaveR
9
"Three strikes and you refactor" - Refactoring autorstwa Martina Fowlera. Reguła trzech , s. 58.
Nick Dandoulakis
20

Projektuję więcej niż kodowałem. Po chwili zamienia się w paraliż analityczny.

Paul Nathan
źródło
44
Od czasu do czasu przywołuję zdanie „Jeśli stwierdzisz, że myślisz za dużo, zatrzymaj się i zrób. Jeśli zauważysz, że robisz za dużo, zatrzymaj się i pomyśl”.
Neil N,
To miłe, ale ile to za dużo?
Hamish Grubijan
Zbyt duże uzależnienie od UML (bezużytecznego języka modelowania). To czasami ma swoje zastosowanie. Ale kiedy widzę, jak ktoś zaczyna rysować diagramy klas i nauczać o korzyściach płynących z „jak wspaniale byłoby wygenerować kod z diagramów”, sznuruję buty do biegania. Ponadto program Visual Studio ma wbudowany interaktywny generator diagramów klas, który robi to wszystko automatycznie i działa jak eksplorator obiektów w crack.
Evan Plaice,
15

Użycie DataSet do wykonywania logiki biznesowej. To wiąże kod zbyt mocno z bazą danych, również DataSet jest zwykle tworzony z SQL, co czyni rzeczy jeszcze bardziej delikatnymi. Jeśli SQL lub baza danych ulegnie zmianie, ma tendencję do przesączania się do wszystkiego, czego dotknie DataSet.

Wykonywanie dowolnej logiki biznesowej wewnątrz konstruktora obiektów. Dziedziczenie i możliwość tworzenia przeciążonych konstruktorów utrudniają konserwację.

Eric Schneider
źródło
15

Skrócenie nazw zmiennych / metod / tabel / ...

Robiłem to cały czas, nawet pracując w językach bez narzuconych ograniczeń długości nazw (no cóż, prawdopodobnie było ich 255 lub coś podobnego). Jednym z efektów ubocznych było wiele komentarzy w całym kodzie wyjaśniających (niestandardowe) skróty. I oczywiście, gdyby nazwy zostały zmienione z jakiegokolwiek powodu ...

Teraz zdecydowanie wolę nazywać rzeczy tym, czym naprawdę są, z dobrymi, opisowymi nazwami. w tym tylko standardowe skróty. Nie ma potrzeby dołączania zbędnych komentarzy, a kod jest dużo bardziej czytelny i zrozumiały.

Rhys Jones
źródło
Tak, pokochasz te typy deklaracji: void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Ed S.,
Albo gorzej (i tak, faktycznie to widziałem), Foo(int arg0, String arg1, float arg2)itp.
Mac
14

Pakowanie istniejących składników dostępu do danych, takich jak biblioteka przedsiębiorstwa, niestandardową warstwą metod pomocniczych.

  • Nie ułatwia to nikomu życia
  • To więcej kodu, który może zawierać błędy
  • Wiele osób wie, jak używać komponentów dostępu do danych EntLib. Nikt oprócz lokalnego zespołu nie wie, jak korzystać z wewnętrznego rozwiązania dostępu do danych
blu
źródło
14

Po raz pierwszy usłyszałem o programowaniu obiektowym czytając o Smalltalk w 1984 roku, ale nie miałem dostępu do języka oo, dopóki nie użyłem kompilatora cfront C ++ w 1992 roku. W końcu zacząłem używać Smalltalk w 1995 roku. technologii i przekonał się, że pozwoli to zaoszczędzić rozwój oprogramowania.

Teraz widzę oo jako jedną technikę, która ma pewne zalety, ale to tylko jedno narzędzie w zestawie narzędzi. Większość pracy wykonuję w Pythonie i często piszę samodzielne funkcje, które nie są członkami klas, i często zbieram grupy danych w krotki lub listy, w których w przeszłości utworzyłbym klasę. Nadal tworzę klasy, gdy struktura danych jest skomplikowana lub potrzebuję zachowania związanego z danymi, ale zwykle się temu opieram.

Właściwie jestem zainteresowany pracą w Clojure, gdy mam czas, co nie zapewnia funkcji oo, chociaż może używać obiektów Java, jeśli dobrze rozumiem. Nie jestem gotów powiedzieć, że cokolwiek takiego jak oo nie żyje, ale osobiście nie jestem tym fanem, jakim byłem.

Greg Graham
źródło
13

W C # przy użyciu _notationdla członków prywatnych. Teraz myślę, że jest brzydki.

Potem zmieniłem na this.notationdla prywatnych członków, ale stwierdziłem, że nie jestem konsekwentny w używaniu go, więc też go porzuciłem.

JulianR
źródło
29
Nadal używam _notation i uważam, że to świetne.
Arnis Lapsa
3
Nienawidzę _notacji; Używam ThisNotation dla członków publicznych i thisNotation dla członków prywatnych.
Callum Rogers,
Ja też tego nienawidzę. To mnie
dezorientuje
4
Nie zgadzam się. Dzięki temu zarządzanie nazwami jest o wiele łatwiejsze. Użyj PascalCase dla właściwości lub publicznych / wewnętrznych elementów członkowskich, _UnderscorePascalCase dla elementów członkowskich, które są uwidocznione za pośrednictwem właściwości, i camelCase dla nazw parametrów w metodach / konstruktorach i elementach prywatnych. Słowo kluczowe „this” jest konieczne tylko wtedy, gdy chcesz przekazać odwołanie do bieżącej klasy poza klasą lub potrzebujesz dostępu do automatycznie wygenerowanego elementu członkowskiego w klasie (takiego jak nazwa, kontrolki itp.).
Gładzica Evan
@Evan: Robię dokładnie to, co opisujesz, z wyjątkiem ostatniej części. Zwykle używam thisor Me(odpowiednio C # i VB.NET) podczas wywoływania metod i właściwości. IMO sprawia, że ​​mój kod jest łatwiejszy do odczytania i zrozumienia później, zwłaszcza gdy w tym konkretnym zakresie znajdują się cztery lub więcej obiektów.
Alex Essilfie
11

Przestałem chodzić na zalecaną przez uniwersytet metodę projektowania przed wdrożeniem. Praca w chaotycznym i złożonym systemie zmusiła mnie do zmiany nastawienia.

Oczywiście nadal badam kod, zwłaszcza gdy mam zamiar dotknąć kodu, którego nigdy wcześniej nie dotykałem, ale zwykle staram się skupić na jak najmniejszych implementacjach, aby coś działało jako pierwsze. To jest główny cel. Następnie stopniowo udoskonalaj logikę i pozwól, aby projekt pojawił się sam. Programowanie jest procesem iteracyjnym i działa bardzo dobrze z podejściem zwinnym i dużą ilością refaktoryzacji.

Kod nie będzie wyglądał tak, jak początkowo myślałeś, że będzie wyglądał. Dzieje się za każdym razem :)

ralphtheninja
źródło
10

Kiedyś lubiłem projektować według kontraktu. Oznaczało to umieszczenie wielu sprawdzeń błędów na początku wszystkich moich funkcji. Kontrakty są nadal ważne, z punktu widzenia rozdzielenia obaw, ale zamiast próbować narzucić to, czego mój kod nie powinien robić, staram się używać testów jednostkowych, aby zweryfikować, co robi.

Frank Schwieterman
źródło
Nauczono mnie programować w ten sposób. Oczywiście uczył mnie nauczyciel matematyki HS, więc wydaje mi się, że ma sens, że chciał, aby jego funkcje były weryfikowane przez siebie.
Alex,
10

Używałbym statycznych w wielu metodach / klasach, ponieważ były bardziej zwięzłe. Kiedy zacząłem pisać testy, praktyka zmieniła się bardzo szybko.

rball
źródło
10

Sprawdzone wyjątki

Niesamowity pomysł na papierze - jasno określa umowę, nie ma miejsca na pomyłkę lub zapominanie o sprawdzeniu wyjątku. Zostałem sprzedany, kiedy pierwszy raz o tym usłyszałem.

Oczywiście w praktyce okazał się takim bałaganem. Do tego stopnia, że ​​mamy dziś biblioteki takie jak Spring JDBC, które ukrywały sprawdzone wyjątki jako jedną z głównych funkcji.

Gregory Mostizky
źródło
9

Że wszystko, co warte zachodu, zostało zakodowane tylko w jednym języku. W moim przypadku wierzyłem, że C jest najlepszym językiem wszechczasów i nigdy nie miałem powodu, aby kodować cokolwiek w innym języku ... nigdy.

Od tego czasu doceniłem wiele różnych języków i zalety / funkcje, które oferują. Jeśli chciałbym zakodować coś małego - szybko - użyłbym Pythona. Jeśli chcę pracować nad dużym projektem, kodowałbym w C ++ lub C #. Jeśli chcę rozwinąć guza mózgu, kodowałbym w Perlu .

Patrick Gryciuk
źródło
8

Kiedy musiałem przeprowadzić refaktoryzację, pomyślałem, że szybsze i czystsze będzie rozpoczęcie od razu i wdrożenie nowego projektu, naprawianie połączeń, aż zaczną działać. Wtedy zdałem sobie sprawę, że lepiej jest przeprowadzić serię małych refaktoryzacji, aby powoli, ale niezawodnie przejść do nowego projektu.

Ying
źródło
pamiętam, ile razy mnie to
ugryzło
8

Być może największą rzeczą, która zmieniła się w moich praktykach kodowania, a także w innych, jest akceptacja zewnętrznych klas i bibliotek pobranych z Internetu jako podstawy zachowań i funkcjonalności w aplikacjach. W szkole w czasie, gdy chodziłem do college'u, zachęcano nas, abyśmy wymyślili, jak ulepszyć sytuację za pomocą własnego kodu i polegać na języku, aby rozwiązać nasze problemy. Wraz z postępem we wszystkich aspektach interfejsu użytkownika i wykorzystania usług / danych nie jest to już realistyczne pojęcie.

Są pewne rzeczy, które nigdy się nie zmienią w języku, a posiadanie biblioteki, która opakowuje ten kod w prostszą transakcję i mniejszą liczbę wierszy kodu, które muszę napisać, jest błogosławieństwem. Łączenie się z bazą danych zawsze będzie takie samo. Wybór elementu w DOM nie zmieni się. Wysyłanie wiadomości e-mail za pośrednictwem skryptu po stronie serwera nigdy się nie zmieni. Konieczność pisania tego raz po raz marnuje czas, który mógłbym wykorzystać na ulepszenie mojej podstawowej logiki w aplikacji.

Liam
źródło
7

Inicjowanie wszystkich członków klasy.

Kiedyś jawnie inicjowałem każdy element klasy czymś, zwykle NULL. Zdałem sobie sprawę, że to:

  • zwykle oznacza, że ​​każda zmienna jest inicjowana dwukrotnie, zanim zostanie odczytana
  • jest głupie, ponieważ w większości języków automatycznie inicjalizuje zmienne do wartości NULL.
  • w rzeczywistości wymusza niewielki spadek wydajności w większości języków
  • może nadużywać kodu w przypadku większych projektów
Nippizaurus
źródło
4
Czasami jednak konsekwencje NIE inicjalizacji wszystkich członków klasy mogą naprawdę ugryźć cię w $$.
muusbolla,
Chyba że używasz języka opartego na prototypach, który tworzy nowe instancje przez klonowanie. Inicjalizacja wszystkich członków może naprawdę zaoszczędzić Ci wielu problemów.
Wojciech Bederski
6

Podobnie jak Ty, zastosowałem wzorce IoC w zmniejszaniu sprzężeń między różnymi komponentami moich aplikacji. Sprawia, że ​​konserwacja i wymiana części są znacznie prostsze, o ile mogę utrzymać każdy element tak niezależny, jak to tylko możliwe. Używam także bardziej obiektowo-relacyjnych struktur, takich jak NHibernate, aby uprościć zadania związane z zarządzaniem bazą danych.

Krótko mówiąc, używam „mini” frameworków, aby pomóc w szybszym i wydajniejszym tworzeniu oprogramowania. Te mini-frameworki oszczędzają dużo czasu, a jeśli zostaną wykonane prawidłowo, mogą sprawić, że aplikacja będzie bardzo prosta w utrzymaniu. Podłącz i graj, aby wygrać!

ajawad987
źródło
-1 Nie mogę znieść rozprzestrzeniania się IoC i frameworków. Odłączenie dobra, IoC i frameworków = niepotrzebna złożoność
Paul Hollingsworth
Jak możesz chwalić oddzielenie, a jednocześnie nienawidzić IoC i innych frameworków? To właśnie robi wiele frameworków IoC i wzorców projektowych na początku.
ajawad987