Dlaczego źle napisać coś w języku X tak, jakbyś pisał program w języku Y pod względem korzystania ze wspólnego paradygmatu kodowania [zamknięte]

25

Jakiś czas temu zadałem pytanie na temat SO napisane w C ++, ale zamiast uzyskać odpowiedź na dany problem, komentarze oszalały na temat mojego stylu kodowania, nawet gdy wskazałem, że jest to fragment kodu WIP i że zamierzałem to wyczyścić później, kiedy miałem uruchomioną skrzynkę podstawową. (Otrzymałem tyle głosów, że zdecydowałem się wyciągnąć pytanie, ponieważ mój przedstawiciel na SO jest już prawie bez szans)

Zastanawiałem się, dlaczego ludzie przyjmują tak twardą postawę: „jesteś noobem, idź się pieprzyć”. Zostałem oskarżony o pisanie w C ++ tak, jakby to była Java. Coś, czego nie rozumiem, a to wciąż mnie zaskakuje.

Od wielu lat programuję w kilku językach OOP, aczkolwiek w przerwach. Wybieram język, który ma być używany, pod względem dostępnych bibliotek i optymalnych środowisk wykonywania dla danego zadania. Przyjmuję wzorce projektowe w kodzie OOP i jestem całkiem pewny, że moje użycie wzorców jest prawidłowe i że OO jest mądre, mogę trzymać własne. Rozumiem zestaw narzędzi OOP, ale wybieram korzystanie z tych narzędzi tylko wtedy, gdy uważam, że jest to naprawdę wymagane, a nie tylko po to, aby użyć mojej sztuczki, aby pokazać moje umiejętności programistyczne. (Wiem, że nie są na najwyższym poziomie, ale myślę, że nie są też na poziomie n00b).

Projektuję kod przed napisaniem pojedynczego wiersza. Aby zdefiniować testy, wymieniam cele określonej klasy i kryteria, które musi spełnić. Ponieważ łatwiej jest mi tworzyć diagramy sekwencji, a następnie pisać kod, postanowiłem napisać moje testy po tym, jak interfejs stanie się oczywisty.

Muszę przyznać, że w kodzie, który zamieściłem w pytaniu, nadal używałem wskaźników, zamiast inteligentnych wskaźników. Używam RAII, kiedy tylko mogę. Wiem, że właściwe RAII oznacza ochronę przed punktami zerowymi, ale działam stopniowo. To była praca w toku i zamierzałem ją później wyczyścić. Ten sposób pracy został zdecydowanie potępiony.

Moim zdaniem najpierw powinienem mieć działający przykład, aby sprawdzić, czy przypadek podstawowy jest realnym sposobem myślenia. Zdarza mi się również myśleć, że wyczyszczenie kodu jest czymś, co jest typowe dla fazy refaktoryzacji zwinnej, po udowodnieniu podstawowego przypadku. Muszę przyznać, że chociaż powoli otrzymuję standard Cxx, wolę używać tego, co rozumiem, zamiast ryzykować używanie koncepcji, których jeszcze nie opanowałem w kodzie produkcyjnym. Od czasu do czasu próbuję nowych rzeczy, ale zwykle w projektach, które mam na boku, tylko w tym celu.

[edytuj] Chciałbym wyjaśnić, że sugestia komara [1] nie pojawiła się w wyszukiwaniu, które zrobiłem, zanim zacząłem zadawać moje pytanie. Jednak chociaż jego sugestia obejmuje jeden aspekt pytania, pytanie, do którego się odnosił, nie odpowiada na sedno mojego pytania, a jedynie na jego część. Moje pytanie dotyczy bardziej odpowiedzi na mój styl kodowania oraz profesjonalnych aspektów obsługi różnych stylów kodowania i (pozornych) poziomów umiejętności. Z moim poprzednim pytaniem w sprawie SO i jego odpowiedzią jest przypadek. [/edytować]

Pytanie brzmi: dlaczego szydzić z kogoś, kto nie używa twojego stylu kodowania?

Sprawy / podziały dla mnie są następujące:

  • Dlaczego niewłaściwą praktyką programistyczną byłoby używanie kodu podatnego na błędy w sytuacjach prototypowych, jeśli refaktoryzacja czyni go później bardziej niezawodnym?
  • W jaki sposób program napisany w C ++ mógłby wyglądać tak, jak napisano w Javie? Co sprawia, że ​​jest to zły program (biorąc pod uwagę, że wskazałem zamiar obecnego stylu i planowane prace nad ulepszeniem?)
  • Jak miałbym być kiepskim profesjonalistą, jeśli wybiorę konstrukcję używaną w pewnym paradygmacie programowania (np. OOP / DP)?

[1] Opracowuj szybko i błędnie, a następnie popraw błędy lub bądź powolny, ostrożny dla każdej linii kodu?

Na nie
źródło
5
Być może lepiej zadać to pytanie w The C ++ Lounge. Najpierw załóż ognioodporny kombinezon.
Robert Harvey
48
Ludzie z C ++ to niezwykła rasa wśród programistów. Zestaw narzędzi Java jest rozsądnym, dobrze zrozumiałym zestawem narzędzi ze znanymi narzędziami w wyściełanym skórzanym etui, który będzie działał w każdym warsztacie narzędziowym. C ++ to cała szopa narzędziowa z piłą do cięcia, wiertarką i niektórymi narzędziami, których nikt nie rozpoznaje, z których tłum C ++ może obsługiwać jak ninja. Martwi ich, gdy ktoś wchodzi i odkłada jakieś narzędzie z powrotem na półkę w niewłaściwym miejscu. Są „miarą dwa razy, raz cięte” programistów.
Robert Harvey
13
Być może jest to ta sama reakcja, którą musiałbyś napisać do kodu Java, który został napisany jak FORTRAN: cały kod w jednej klasie, bez kolekcji, tylko tablice o stałym rozmiarze, z osobnymi intzmiennymi do śledzenia rzeczywistej długości.
kevin cline
14
Jeśli napiszesz C ++ jak Java, prawdopodobnie skończy się zbyt wiele alokacji sterty, co spowoduje, że twój program będzie działał gorzej niż mógłby. Języki zwykle są projektowane i optymalizowane w celu promowania określonych wzorców, a jeśli je złamiesz, sytuacja będzie się pogarszać.
Gort the Robot
5
Wysłałeś kod online, aby uzyskać jakąś formę pomocy. Zdaję sobie sprawę, że nie chciałeś / nie spodziewałeś się wszystkich opinii na temat Twojego stylu, ale czy wolałbyś w ogóle nie otrzymywać pomocy? Bierzesz dobro ze złem. Programiści muszą szukać błędów w kodzie; to jest to, co robimy.
JeffO

Odpowiedzi:

26

Nie widząc kodu, o którym mowa, istnieje kilka sposobów pisania kodu Java w C ++, niektóre gorsze niż inne.

  1. Z jednej strony mamy do czynienia ze źródłem takim jak Java: wszystko w jednym pliku, wszystko w definicji klasy itp .:
    class HelloWorldApp {
    public:
        void main() {
            cout << "Hello World!" << endl;
        }
    };
    Tak wyglądałoby źródło Java. Jest to technicznie legalne w C ++, ale umieszczenie wszystkiego w pliku nagłówkowym i wszystkiego w wierszu (poprzez zdefiniowanie go w deklaracji klasy) jest strasznym stylem i zabije wydajność kompilacji. Nie rób tego
  2. Nadmiernie OO - Aby uprościć, w Javie jest to Królestwo Rzeczowników , w którym wszystko jest przedmiotem. Dobry (tj. Idiomatyczny) kod C ++ jest bardziej skłonny do korzystania z bezpłatnych funkcji, szablonów itp. Zamiast próbować wcisnąć wszystko w obiekt.
  3. Bez RAII - już o tym wspomniałeś - używając wskaźników i ręcznego czyszczenia zamiast inteligentnych wskaźników. C ++ udostępnia narzędzia takie jak RAII i inteligentne wskaźniki, więc dobry (tj. Idiomatyczny) kod C ++ używa tych narzędzi.
  4. Brak zaawansowanego C ++ - podstawy Java i C ++ są wystarczająco podobne, ale kiedy przejdziesz do bardziej zaawansowanych funkcji (szablony, biblioteka algorytmów C ++ itp.), Zaczynają się one rozchodzić.

Z wyjątkiem nr 1, żaden z nich nie czyni programu C ++ złym programem, ale nie jest to również rodzaj kodu, nad którym wolę pracować jako programista C ++. (Nie podobałoby mi się też praca z Perlem nie idiomatycznym lub w stylu C, Python nie idiomatyczny itp.) Język ma własne narzędzia, idiomy i filozofię, a dobry kod używa tych narzędzi i idiomów zamiast próbować używać najniższy wspólny mianownik lub próba odtworzenia podejścia innego języka. Pisanie nieidiomatycznego kodu w określonym języku / domenie problemowej / czymkolwiek nie czyni kogoś złym programistą, oznacza to po prostu, że muszą dowiedzieć się więcej o tym języku / domenie problemowej / czymkolwiek. I nie ma w tym nic złego; jest bardzo długa lista rzeczy, o których muszę się więcej dowiedzieć, a w szczególności C ++ ma absolutną masę rzeczy do nauczenia się.

Jeśli chodzi o szczególne pytanie dotyczące pisania podatnego na błędy kodu z zamiarem jego późniejszego wyczyszczenia, nie jest on czarno-biały:

  • Jeśli jakiś prototypowy kod nie obsługuje każdego możliwego wyjątku i każdego możliwego przypadku narożnika, należy się tego spodziewać. Spraw, by działało, a następnie działaj solidnie. Nie ma problemu.
  • Jeśli jakiś prototypowy kod jest napisany w złym stylu lub złym projekcie (zły dla danego języka i jego idiomów, zasadniczo zły projekt dla problemu itp.), To chyba że piszesz go jako wyrzucenie proof-of-concept, nic nie zyskujesz.

Aby użyć na przykład wskaźników surowych w porównaniu ze wskaźnikami inteligentnymi, jeśli zamierzasz pracować w C ++, użycie RAII i inteligentnych wskaźników jest na tyle podstawowe, że pisanie kodu w ten sposób powinno być szybsze niż powrót i wyczyszczenie go później. Ponownie, niezastosowanie się do tego nie oznacza, że ​​ktoś jest złym programistą, nieprofesjonalnym itp., Ale oznacza, że ​​jest więcej do nauczenia się.

Josh Kelley
źródło
11
jest perl idiomatyczny?
maniak zapadkowy
21
@Onno Kiedy pytasz „Jak wbić tę śrubę w ścianę, żeby się nie zgięła ?” wszyscy powiedzą ci, abyś nie używał młotka.
Sjoerd
9
@Onno W C ++ wskaźniki newsą uważane za narzędzia powertools. Automatyczne przechowywanie jest narzędziem ręcznym.
Sjoerd
9
@Onno: Musisz zdawać sobie sprawę, że kursy programowania w C ++ mają tendencję do opóźnień w przyjmowaniu nowoczesnych idiomów, a to, co uważa się za dobre C ++, również ewoluowało ogromnie od czasu wynalezienia C ++.
Bart van Ingen Schenau
7
Ze względu na historię C ++ i ogromną liczbę programistów, którzy nauczyli się tego języka, zanim pojawiło się wiele bardziej zaawansowanych funkcji języka, istnieje wiele gównianych języków C ++, które wciąż są pisane przez ludzi, którzy pisali tak, jak dziesięć lat temu. Tetchyness w takich rzeczach jak RAII polega na zachęcaniu wszystkich do korzystania z nowoczesnych metod, abyśmy mogli przestać widzieć te same przewidywalne awarie.
Gort the Robot
42

Każdy język programowania ma zestaw idiomów i najlepszych praktyk, które zwykle prowadzą do eleganckiego, poprawnego i wydajnego kodu. Oto kilka najgorszych praktyk, które doskonale działają w innym języku:

  • Będę krzyczeć, jeśli napiszesz for ($i = 0; $i < 42; $i++) { … }w Perlu, ale nie w PHP
    (w Perlu, zmienne powinny być deklarowane, a takie pętle powinny iterować w zakresie)
  • Będę płakać, jeśli napiszesz new Foo()w C ++ bez uzasadnionego powodu, ale nie w Javie
    (C ++ nie ma funkcji wyrzucania elementów bezużytecznych, więc należy użyć RAII. W przeciwnym razie Noobs wycieknie pamięć)
  • Skulę się, jeśli zadeklarujesz wszystkie zmienne na górze swojej funkcji, z wyjątkiem C89, Pascal lub JavaScript.
  • Zrobię facepalm, jeśli umieścisz wszystkie swoje funkcje w klasie w Pythonie, ale nie w Javie
    (Python jest językiem opartym na wielu paradygmatach, zamiast tego wymusza „OOP” i obsługuje funkcje na najwyższym poziomie)
  • Będę płakać, jeśli będziesz return nullw Scali, ale nie w jakimkolwiek języku podobnym do C
    (ponieważ Scala ma Optiontyp)
  • Będę narzekać, jeśli napiszesz algorytm rekurencyjny w Javie, ale nie w OCaml
    (ponieważ stos Java przepełnia się szybko, podczas gdy OCaml ma optymalizację wywołania ogona)

Łatwo jest używać nowego języka, tak jakby to było coś, co wiesz, a przy odrobinie szczęścia to nawet zadziała. „Możesz pisać Fortran w dowolnym języku”. Ale tak naprawdę nie chcesz ignorować określonych funkcji języka X, ponieważ są duże szanse, że X oferuje przewagę nad U.

Wybieram język, który ma być używany pod względem dostępnych bibliotek i optymalnych środowisk wykonywania dla danego zadania ” - ale to, czy ten język X jest rzeczywiście lepszy niż język U dla danego zadania, zależy również od jego znajomości tego języka, lub ile czasu zajmie zapoznanie się z nim w wystarczającym stopniu, aby dobrze go używać. Nie dałbyś ciężkiej piły łańcuchowej tylko dlatego, że tnie ona drewno najszybciej, gdy naprawdę chcesz swój stary nóż do pióra, ponieważ idealnie pasuje do dłoni. Chyba że naprawdę chcesz powalić drzewo.

Ale twoje pytanie dotyczy bardziej kwestii kulturowej : nauka wszystkich najlepszych praktyk zajmuje dużo czasu, a nowicjusze zadają najwięcej pytań, podczas gdy guru odpowiadają na nie. Ale to, co jest oczywiste dla guru, nie jest oczywiste dla początkującego, a guru czasami o tym zapominają. Jako nowicjusz rozwiązaniem jest nie przestać zadawać pytań. Można jednak wykazać się otwartością na naukę i stosowanie najlepszych praktyk, np. Próbując maksymalnie wyczyścić kod, zanim pokażemy go innym. Większość języków ma kilka podstawowych najlepszych praktyk, które są łatwe do nauczenia się, nawet jeśli cała krzywa uczenia się jest naprawdę bardzo długa.

Częstym problemem jest to, że ludzie początkujący w programowaniu ignorują wcięcia lub inne formatowanie, a następnie są zdezorientowani, ponieważ ich program nie działa. Byłbym również zdezorientowany, a pierwszym krokiem do zrozumienia programu jest upewnienie się, że jest on idealnie ułożony. Wtedy proste błędy, takie jak zapomniany cytat zamykający lub brakujący przecinek, nagle stają się oczywiste. Ufam, że już ćwiczysz dobre formatowanie, a oto metafora innych najlepszych praktyk: najlepsze praktyki zapobiegają błędom, najlepsze praktyki ułatwiają znajdowanie błędów, stosowanie najlepszych praktyk pojawia się przed znalezieniem problemu .

Mówienie „Naprawię to później” jest zbyt tanie, gdy naprawienie go teraz rozwiązałoby problem (ta legalna „faza oczyszczania” może nigdy nie nadejść, więc jedyną odpowiedzialną opcją jest zrobienie tego dobrze pierwszy raz). Przynajmniej próba uczynienia twojego kodu tak dobrym, jak to możliwe, zanim poprosisz innych o pomoc, ułatwia im rozumowanie twojego kodu, więc jest to grzeczna rzecz.

amon
źródło
Masz rację co do niektórych punktów, które robisz, ale ostatecznie nie sądzę, byś osiągnął cel. Zakładasz zdobycie wiedzy przed doświadczeniem, które ją zdobędzie.
Onno
4
@Onno Moje główne punkty (które odpowiadają na pytania, które zadałeś) to to, że nie możesz przenieść nawyków z jednego języka i założyć, że jest to najlepsza praktyka w innym, i że próba napisania czystego kodu od samego początku jest lepsza niż czyszczenie to później. Czyszczenie kodu - najlepiej jak potrafisz - jest koniecznością, zanim poprosisz innych o pomoc (zobacz sscce.org, aby uzyskać porady dotyczące dobrych fragmentów kodu). Zrzucanie kodu śmieci na SO z „proszę to naprawić” jest niedopuszczalne, zwłaszcza jeśli wiesz lepiej.
amon
2
Ale jeśli chodzi o pytanie, na które sugerujesz: odpowiedź jm666 zawiera kluczową kwestię: guru myśli „dlaczego zapytałbyś o X, jeśli sam nie chciałbyś zostać X-guru?” Zbyt często znajduję się w tym niepomyślnym sposobie myślenia . Możliwym sposobem na rozbrojenie jest wspomnienie, że wciąż jesteś na samym początku krzywej uczenia się i przyjrzysz się temu później, ale na razie masz pod ręką to bardziej bezpośrednie pytanie. Jest to jednak problem z komunikacją, a nie problem z programowaniem.
amon
6
Zarówno C ++ i C # mieć optional<T>i Nullable<T>odpowiednio. Ponadto praktycznie wszyscy przeciekają pamięć w C ++ bez RAII, noob lub nie.
DeadMG
Uważam, że deklarowanie zmiennych na początku bloku zwykle ułatwia odczytanie kodu w większości języków. W ten sposób wiesz dokładnie, gdzie szukać, kiedy potrzebujesz pomocy w zapamiętywaniu, jakie typy są wszystkie twoje zmienne i tym podobne.
Delektuj się
12

Nie jestem hardcorowym programistą C ++, ale ...

Dlaczego niewłaściwą praktyką programistyczną byłoby używanie kodu podatnego na błędy w sytuacjach prototypowych, jeśli refaktoryzacja czyni go później bardziej niezawodnym?

Należy pamiętać, że błąd w C ++ zwykle oznacza „niezdefiniowane zachowanie”. W bezpiecznym języku najgorszym, co może się zdarzyć, jest wyjątek natychmiast kończący program. W C ++ masz szczęście, jeśli dostaniesz segfault. Jest całkowicie możliwe, że Twój program robi coś subtelnie złego. Może również zachowywać się poprawnie przez pewien czas i ujawniać błędy znacznie później, lub może zachowywać się poprawnie cały czas, ale ostatecznie pochłonie całą twoją pamięć.

W każdym razie wystarczy tylko jeden błąd, aby całkowicie usunąć program z szyn i przejść na nieznane terytorium. Jest prawdopodobne, że dla etatowego programisty C ++ „przypadek podstawowy” oznacza „brak możliwości nieokreślonego zachowania lub wycieków pamięci”.

W jaki sposób program napisany w C ++ mógłby wyglądać tak, jakby był napisany w Javie? Co sprawia, że ​​jest to zły program?

Nie wydaje mi się, aby istniała odpowiedź na to pytanie, która nie będzie w dużej mierze spekulacyjna i opiniowana. Jeśli jednak chcesz, żebym się tym zajął, Java ma kilka powiązanych ze sobą antypatternów, takich jak fakt, że wszystko musi być przedmiotem. Gdzie w innych językach chcesz przekazać wskaźnik, funktor, lub funkcji, w Javie zwykle znaleźć mnóstwo bezsensowne i wąsko-użyteczne ThingDoers, FooFactoriesi IFrobnicatorsktóre są tylko funkcje w przebraniu.

Podobnie, w przypadku gdy w innych językach możesz przekazać prostą krotkę lub bezimienną strukturę, w Javie spakowanie nawet zaledwie 2 obiektów do prostego kontenera danych wymaga uprzedniego zdefiniowania ponad 30-liniowej klasy NamedThing z setterami, getterami i Javadocsem. Względny brak funkcji Javy zmusza programistów do wykonywania obiektowych podwójnych backflipów, aby czasem załatwić sprawę. Wynikowy kod rzadko jest idiomatyczny poza Javą.

Jest też fakt, że w C ++ potrzebujesz bardzo uproszczonego wykresu obiektowego do ręcznego zarządzania pamięcią; zwykle obiekt jest własnością dokładnie jednego innego obiektu. W Javie nie musisz stosować się do tak ścisłych ograniczeń, ponieważ śmieciarz zapewnia, że ​​rzeczy zostaną wyczyszczone, gdy nie będzie już żadnych odniesień do nich. Zdecydowanie istnieje ryzyko nieprawidłowego zarządzania pamięcią, jeśli po prostu transliterujesz kod z Java na C ++.

Wreszcie może to być po prostu elitaryzm. Nie będę udawał, że stanowią większość, ale zdecydowanie widziałem sentyment „Nie potrzebuję języka, który trzymałby mnie za rękę i powstrzymywał mnie od robienia głupich rzeczy” wśród niektórych programistów C ++. Ich zdaniem C ++ jest „prawdziwym” językiem, a jeśli nie możesz poradzić sobie z jego osobliwościami, nie jesteś „prawdziwym programistą”.

Doval
źródło
1
Wiele z tego zostało złagodzonych w Javie 8 - Lambdas jeździ, aby przede wszystkim uratować dzień :-)
Martijn Verburg
@MartijnVerburg Zgoda, ogromny krok naprzód. Ale problemy technologiczne można łatwo rozwiązać! Stare nawyki umierają ciężko, a piętno jeszcze trudniejsze. Heck, niektórzy posuną się tak daleko, że narzekanie Java nie potrzebuje żadnej z tych „nowych” funkcji i że jest ona w drodze do zostania kolejnym C ++.
Doval
Tak zawsze potrząsać głową na to - Java będzie celowo zawsze Evolve wolniej niż inne języki, jak to długoterminowe koń pociągowy. JVM może jednak skakać naprzód i skacze nieco szybciej, dzięki czemu takie rzeczy, jak Lambdas, mogą w końcu dojść do tego języka.
Martijn Verburg
6

Nieco odpowiedź na temat ...

Nie martw się - jest to powszechne „zachowanie” w każdej społeczności ekspertów. I bądź szczery, jeśli jesteś dobry w jakimkolwiek języku i napotkasz kod, który jest „dziwny”, prawdopodobnie również go skrytykujesz. (ponieważ chcę TEACH).

Jestem w perlowym świecie - kiedy zobaczę coś takiego:

$imax=$#array;
$str=""
for($i=0; $i<$imax; $i++) {
    $str = "$str" . $array[$i];
}

zamiast:

my $str = join '', @array;

napewno to skomentuje - (czytaj: naucz autora) o joinfunkcji.

W każdym razie zbyt duża krytyka przynosi efekt przeciwny do zamierzonego, a jednym z najlepszych przykładów jest następny: (wzięty z: http://perl-begin.org/humour/#How_can_I_switch_off_the_T.V..3F )

(Ten fragment został wysłany anonimowo do pastebota w dniu 23 marca 2011 r. Został umieszczony tutaj dla potomności po pewnej edycji.) - nieco zmodyfikowany

Pytanie: jak mogę włączyć telewizor?

Co PO chce usłyszeć?

Na przykład: Znajdź przycisk włączania / wyłączania pilota telewizora i naciśnij go. Przycisk jest zwykle czerwony i znajduje się w najwyższej linii na pilocie.

Odpowiedź eksperta #perl: Po pierwsze, co masz na myśli mówiąc „włącz”? Zdefiniuj najpierw. Nie wklejaj telewizora, pilota do telewizora i salonu.

... po nopaste:

Twój pokój jest brzydki. A telewizor wygląda okropnie. Użyj Mr. Clean na ekranie i najpierw posprzątaj swój salon. Użyj trzech mopów czyszczących zamiast dwóch. Używaj HDMI i nigdy nie używaj złącz scart (?), Chyba że naprawdę tego chcesz. Pilot do telewizora ma nieczytelne przyciski, najpierw posprzątaj. Jesteś początkującym, więc przeczytaj:

http://experts.blog/how_to_design_a_future_3D_TV.html http://experts.blog/the_basics_of_tv_repairing.html http://experts.blog/viruses_in_living_room_short_essay.html http://experts.blog/global_chip_replacement_guide

Gość IRC: Ale nie chcę być ekspertem telewizyjnym.

Odpowiedź: Dlaczego więc chcesz włączyć telewizor ?!

jm666
źródło
1
Ta odpowiedź nie jest nie na temat. Wyjaśnia dokładnie, dlaczego ktoś krytykuje niekonwencjonalne użycie języka i dlaczego czasami ta automatyczna krytyka może posunąć się za daleko. Lubię to.
trichoplax
1

Dlaczego niewłaściwą praktyką programistyczną byłoby używanie kodu podatnego na błędy w sytuacjach prototypowych, jeśli refaktoryzacja czyni go później bardziej niezawodnym?

Pisząc szybko i brudnie z myślą o późniejszym naprawianiu, istnieje niebezpieczeństwo zapomnienia czegoś, co musisz naprawić.

W jaki sposób program napisany w C ++ mógłby wyglądać tak, jak napisano w Javie? Co sprawia, że ​​jest to zły program (biorąc pod uwagę, że wskazałem zamiar obecnego stylu i planowane prace nad ulepszeniem?)

W java nie musisz myśleć o tym, kto jest właścicielem określonego obiektu, po prostu przekazujesz referencję i zapominasz o tym, jakby to było nic. Jednak w C ++ musi istnieć jasna definicja tego, kto jest właścicielem obiektu i kto jest odpowiedzialny za jego wyczyszczenie.

Jak stałbym się złym profesjonalistą, jeśli wybiorę konstrukcję używaną w pewnym paradygmacie programowania (np. OOP / DP)

Nie zrobiłbyś; C ++ jest językiem opartym na wielu paradygmatach, zdarza się, że dość dobrze obsługuje OOP, ale potrafi też robić wiele innych rzeczy. Jednak większość z nich sprowadza się do użycia odpowiedniego narzędzia do pracy zamiast wyciągania młotka za każdym razem, gdy trzeba wbić spiczasty kolec w jakieś drewno.

Powodem, dla którego otrzymałeś złą odpowiedź, jest to, że większość osób na SO ocenia umiejętności na podstawie tego, jak idiomatycznie możesz pisać w języku, o który pytasz. Ludzie znający C ++ mają tendencję do szarpania, gdy widzą zły kod, który wygląda jak coś, co gryzie ich w przeszłości.

maniak zapadkowy
źródło
Widzę, że zapominanie o poprawie może być problemem dla niektórych, ale mam długą listę zadań i jestem bardzo zdyscyplinowany w dodawaniu tagów todo do tego rodzaju zadań. (dlatego lubię VS, jest całkiem dobry w zarządzaniu pracą) To samo dotyczy dokumentacji. Nie piszę wiersza kodu przed napisaniem dokumentacji na jego temat. Jeśli chodzi o pytanie dotyczące własności, ze względu na diagramy sekwencji myślę, że mam dobry pomysł na to, kto ma do kogo linki.
Onno
1
@Onno: Szczerze mówiąc, nikt nie wie ani nie dba o to, jak dobrze osobiście śledzisz te rzeczy. Zdecydowana większość ludzi, którzy piszą w C ++, który wygląda jak Java lub C, nie jest nawet tak drobiazgowa. O wiele lepiej jest dla nich nauczyć się robić rzeczy za pierwszym razem niż pisać sobie notatkę, aby wrócić i naprawić to później, ponieważ doświadczenie pokazuje, że praktycznie nigdy tego nie robią.
cHao