Czy są jakieś techniki programowania, które okażą się nadużywane (IE są używane o wiele bardziej niż powinny) lub nadużywane, lub używane trochę do wszystkiego, nie będąc jednocześnie dobrym rozwiązaniem wielu problemów, które ludzie próbują rozwiązać z tym.
Mogą to być wyrażenia regularne, jakiś wzorzec projektowy, a może algorytm lub coś zupełnie innego. Może uważasz, że ludzie nadużywają wielokrotnego dziedziczenia itp.
Odpowiedzi:
Komentarze w kodzie
Chciałbym tylko, żeby profesorowie uniwersyteccy zrozumieli, że nie muszą uczyć swoich studentów pisania 10 wierszy komentarzy stwierdzających, że poniższy kod jest pętlą for, iterującą od 1 do liczby x. Widzę to w kodzie!
Naucz je, jak najpierw napisać kod samokontrujący, a następnie odpowiednio komentować to, co nie może być odpowiednio samo-dokumentujące. Świat oprogramowania byłby lepszym miejscem.
źródło
Clean Code
, Fowler wyraźnie stwierdza, że nieaktualna dokumentacja jest gorsza niż brak dokumentacji i że wszystkie komentarze mają tendencję do starzenia się i migrowania z dala od kodu, który dokumentują. Cała ta książka jest o tym, jak napisać samodokumentujący się kod.Wzór singletonu.
Oczywiście, jest to użyteczny wzorzec, ale za każdym razem, gdy nowy programista dowiaduje się o tym wzorcu, zaczyna próbować zastosować go do każdej tworzonej przez siebie klasy.
źródło
$this->
. PHP jest zepsutym językiem, więc nie mogę oczekiwać, że frameworki będą doskonałe.Najbardziej zła rzecz, aby chronić głupie programowanie. próbując złapać wszystko i nic nie robiąc z chwytem
Drżę, gdy widzę próbę złapania, która nic nie robi i jest zaprojektowana do obsługi głupiej logiki. Zasadniczo połowy próbne są nadmiernie wykorzystywane, jednak w niektórych przypadkach są bardzo przydatne.
źródło
Zaufaj StackOverflow, aby rozwiązać swoje problemy, zamiast rozwiązywać problemy.
Nowi programiści, którzy (zbyt często) znajdują bogactwo wiedzy na temat SO, zanim zaczną myśleć i wypróbowywać różne rzeczy.
W moich czasach musieliśmy kodować z książek, bez internetu, bez SO. A teraz zejdź z mojego trawnika.
źródło
Oczywiście OOP. Jest bardzo cenny, ale w przypadku niewłaściwego użycia może całkiem łatwo ukryć czysty kod (niektóre przykłady programowania S4 w R przychodzą na myśl), i może powodować ogromny narzut, który jest niepotrzebny i może kosztować dużo czasu na wydajność.
Inną rzeczą jest to, że (np. Perl) OOP często sprowadza się do pisania tego samego na odwrót:
result = $object ->function(pars)
zamiastresult = function(object, pars)
To czasami ma sens, ale w połączeniu z programowaniem proceduralnym może powodować, że czytanie kodu jest dość mylące. Poza tym po prostu wprowadzasz więcej kosztów ogólnych tam, gdzie nie poprawia to projektu. Sprowadza się to również do tego, co mówi się o wzorze singletonu: należy go stosować, ale nie we wszystkim.Sam korzystam z OOP, ale w mojej dziedzinie (obliczenia naukowe) wydajność jest dużą sprawą, a OOP jest często nadużywane, ponieważ wszyscy studenci otrzymują obecnie Javę. Doskonale nadaje się do radzenia sobie z większymi problemami, do konceptualizacji i tak dalej. Ale jeśli pracujesz np. Z sekwencjami DNA w BioPerl, używanie obiektów za każdym razem i konsekwentna praca z modułami pobierającymi i ustawiającymi może dziesięciokrotnie wydłużyć czas obliczeń. Kiedy Twój kod działa kilka dni zamiast kilku godzin, ta różnica naprawdę ma znaczenie.
źródło
Foo.DoX().DoY().DoZ()
) jest fajne, ale zdecydowanie nie jest to jedyny sposób, aby coś zrobić. Kompozycja funkcji (jakdoZ . doY . doX $ foo
jest całkowicie poprawną alternatywą.Spędziłem kilka lat w formularzach internetowych ASP.NET, musiałbym powiedzieć jednoznacznie:
Inteligentny interfejs użytkownika
Chociaż tworzenie formularzy internetowych z możliwością testowania warstwowego jest całkowicie możliwe, Visual Studio ułatwia programistom jednokrotne kliknięcie w celu utworzenia formularzy ściśle powiązanych ze źródłem danych, z logiką aplikacji zaśmieconą wokół całego kodu interfejsu użytkownika.
Steve Sanderson wyjaśnia ten anty-wzór znacznie lepiej niż ja w swojej książce Pro ASP.NET MVC:
źródło
Widzę to od czasu do czasu i zwykle wynika to z niepełnego zrozumienia wyrażeń boolowskich.
źródło
bool
zaczynając odis
lubhas
, nie musisz uwydatniać kodu= true
.Ponowne wdrożenie podstawowej (lub w inny sposób zapewnionej) funkcjonalności, albo z powodu niewiedzy o jej istnieniu, albo z powodu postrzeganej potrzeby dostosowywania.
źródło
Dziedzictwo.
Nie egzekwuj, to nie ma sensu.
źródło
Dostosowywanie gotowego oprogramowania.
Chociaż mogę przyznać, że może to być przydatne, zastanawiam się, ile pieniędzy wydaje się na drobiazgi w celu uzyskania wątpliwych korzyści. W tym miejscu firma może wydawać setki tysięcy, jeśli nie miliony dolarów na licencje na niektóre oprogramowanie, które następnie dostosowuje się, ponieważ jest tak konfigurowalne, edytowalne i elastyczne, że tak naprawdę nie robi wiele domyślnie. Ostatecznie jest to aplikacja niestandardowa, ponieważ cały nowy kod dodaje to, co pierwotnie kupiono.
źródło
Używanie kompilatora jako debuggera.
Ignorowanie ostrzeżeń użytkownika lub wyłączenie ich całkowicie.
Zmienne globalne.
źródło
Wszystkie wzory projektowe.
Są jak sól lub cukier. Niektóre z nich sprawiają, że jest to świetne, wiele z nich sprawia, że jedzenie jest do kitu.
Nie zrozum mnie źle. Wzory projektowe to wspaniałe techniki. Często ich używałem. Ale czasami znajduję programistów (niektórzy z nich byli moi szefowie), którzy mieli takie „musisz użyć wzorca projektowego”, nawet jeśli nie pasuje to do problemu !!!
Jednym z przykładów jest „Wzorzec gościa”, który jest bardziej ukierunkowany na „Kolekcje liniowe / sekwencyjne”. Raz musiałem pracować ze strukturą danych drzewa. Aby „odwiedzić” każdy element, koduję metodę wzoru innego niż projektowy, a były szef nalega na użycie lub dostosowanie „Wzorca gościa”. Następnie przeglądam sieć w celu uzyskania drugiej opinii. Cóż, inni programiści mieli tę samą sytuację i to samo rozwiązanie. I nazwij to „Drzewnym / Hierarchicznym Wzorem Odwiedzającym”, jako NOWY Wzorzec Projektu
Mam nadzieję, że został dodany jako nowy wzór do istniejących, w nowej wersji książki „Wzory projektowe”.
źródło
Wykorzystanie wyjątków jako kontroli przepływu. Trochę podobne do tej odpowiedzi , ale różne.
Przełykanie wyjątków jest złą formą, ponieważ wprowadza tajemnicze, trudne do znalezienia błędy w kodzie. Z drugiej strony stosowanie wyjątków jako kontroli przepływu jest złe, ponieważ powoduje, że kod jest znacznie bardziej nieefektywny niż mógłby być i jest koncepcyjnie niechlujny.
Obsługa wyjątków powinna być wykorzystywana tylko do obsługi naprawdę wyjątkowych (duh), nieprzewidzianych scenariuszy, a nie do rzeczy takich jak użytkownik wpisujący alfabet, gdzie oczekiwana jest liczba. Ten rodzaj nadużywania wyjątków jest niezwykle powszechny wśród złych programistów w świecie Java.
źródło
Idę z nieelastycznością poprzez nadmierne ukrywanie danych.
Wszyscy wiemy, że abstrakcja i ukrywanie implementacji są dobre, ale więcej nie zawsze jest lepsze. Przesadzone, możesz uzyskać nieelastyczny wynik, który nie poradzi sobie ze zmianami wymagań. Aby poradzić sobie ze zmianą, musisz nie tylko zmodyfikować klasę, która musi poradzić sobie z tą zmianą, ale także stworzyć sposób, aby informacje, które nigdy wcześniej nie były potrzebne, były dostępne pomimo warstw ukrywania danych.
Problem polega na tym, że podobnie jak w przypadku wszystkich problemów związanych ze znalezieniem właściwej równowagi dla każdego kontekstu, potrzeba doświadczenia.
źródło
Odsłanianie wewnętrznych tablic
Według http://www.oracle.com/technetwork/java/seccodeguide-139067.html
źródło
Zmienny stan i pętle. Prawie nigdy ich nie potrzebujesz i prawie zawsze dostajesz lepszy kod bez nich.
Na przykład jest to pobierane bezpośrednio z wątku StackOverflow:
Oboje robią to samo. Ale nie mam pojęcia, co oni robią. Na szczęście pytanie faktycznie wyjaśnia, co robią, więc mogłem je przepisać w następujący sposób:
Nie ma pętli i nie można zmieniać stanu. No dobrze, bez wyraźnych pętli i liczników pętli.
Kod stał się znacznie krótszy, o wiele prostszy, bardziej podobny do opisu tego, co powinien robić (szczególnie w przypadku Rubiego, prawie bezpośrednio mówi „pogrupuj rzeczy według typu”) i znacznie mniej podatny na błędy. Nie ma niebezpieczeństwa ucieczki z końca tablicy, błędów słupka ogrodzeniowego lub błędów pojedynczych z indeksami pętli i warunkami zakończenia, ponieważ nie ma wskaźników pętli i warunków zakończenia.
źródło
(acc[thing.type] || (acc[thing.type] = []))
, w przeciwieństwie do `= [rzecz], unless you want to add
rzecz` na liście dwa razy ... Czy coś mi brakuje?Kpić. Wprowadza zbyt wiele sztucznych wymagań dla nadmiernego odsprzęgania w kodzie, prowadzi do nadmiaru kodu ravioli i zmusza projekt w stylu OO do gardła, gdy bardziej proceduralny lub funkcjonalny projekt może być prostszym rozwiązaniem problemu.
źródło
Programiści z Delphi na całym świecie odkrywali w ciągu ostatnich dwóch lat, jak źle jest używać tablic znaków do przechowywania bajtów ze względu na hurtową konwersję Unicode
I „wkrótce” dowiemy się, jak źle jest przechowywać liczby całkowite na listach, gdy chcemy zmienić na 64-bitowe.
źródło
Nieruchomości. Wiem, że jest to kontrowersyjne, ale uważam, że właściwości .net są znacznie nadużywane.
Jaka jest różnica między tymi dwiema liniami?
Dla programisty różnica polega na: absolutnie niczym. Skompilowana forma jest nieco inna, więc jeśli piszesz bibliotekę, a ta biblioteka będzie aktualizowana w programach, a nie możesz ponownie skompilować samych programów (na przykład, jeśli piszesz interfejs dla wtyczek, które powinien działać w różnych wersjach oprogramowania), nie powinieneś używać pól publicznych, ponieważ nie możesz ich zastąpić właściwościami. W każdym innym przypadku nie ma absolutnie żadnej różnicy między użyciem pola lub auto-właściwości bez modyfikatorów.
źródło
YAGNI
ale czuję, odbiegające w tym przypadku nic nie kosztuje);
na{ get { ... } set { ... } }
więcej pracy niż przejście{ get; set; }
na{ get { ... } set { ... } }
?