Paylaşılan bir kodlama paradigmasını kullanmak için Y dilinde bir program yazıyormuşsunuz gibi, X dilinde bir şeyler yazmak neden bu kadar kötü? [Kapalı]


25

Bir süre önce, SO hakkında C ++ ile yazılmış bir şey hakkında bir soru sordum, ancak eldeki soruna bir cevap almak yerine, kodlama tarzım hakkında bir WIP kod parçası olduğunu belirttiğimde bile tüm yorumlar çıldırdı. ve temel davayı çalıştırdığımda daha sonra temizlemek istediğimi söyledim. (Çok fazla aşağı oy aldım, çünkü SO hakkındaki sorumum neredeyse berbat olduğu için soruyu sormaya karar verdim)

İnsanların neden bu kadar sert bir çizgiyi benimsediğini merak ettim, "sen bir asersin, git kendini becer" tutumunu. C ++ yazıyormuş gibi Java ile suçlanıyordum. Anlayamadığım ve hala beni şaşırtan bir şey.

Aralıklar da olsa birkaç yıldır pek çok OOP dilinde programlama yapıyorum. Kullanılabilir kütüphaneleri ve eldeki iş için optimum uygulama ortamları açısından kullanılacak dili seçiyorum. OOP kodunda tasarım kalıpları benimsemekte ve kalıp kullanımımın sağlam olduğundan ve OO'nun akıllıca olacağına eminim. OOP araç kutusunu anlıyorum, ancak sadece gerçekten gerekli olduğunu düşündüğümde araçları kullanmayı seçiyorum, kodlama düşüncelerimi göstermek için sadece düzgün bir numara kullanmak için değil. (Bildiğim kadarıyla üst çentik değil, ama sanırım n00b düzeyinde değil).

Tek bir satır yazmadan önce kodumu tasarlarım. Testleri tanımlamak için, belirli bir sınıfın hedeflerini ve uyması gereken test kriterlerini listelerim. Dizi diyagramları oluşturmak ve kod yazmak benim için daha kolay olduğu için, arayüz belirginleştikten sonra testleri yazmayı seçtim.

Soruya gönderdiğim kod parçasında, akıllı işaretçiler kullanmak yerine hala işaretçiler kullandığımı itiraf etmeliyim. Ne zaman istersem RAII kullanıyorum. Uygun RAII'nin boş nokta işaretçilerine karşı korunmak anlamına geldiğini biliyorum, ancak adım adım çalışıyorum. Devam eden bir işti ve daha sonra temizlemek istedim. Bu çalışma şekli şiddetle kınandı.

Benim görüşüme göre, öncelikle çalışan bir örneğe sahip olmalıyım, böylece temel durumun uygulanabilir bir düşünce tarzı olup olmadığını görebiliyorum. Ayrıca, temel temizliği kanıtlandıktan sonra, kodu temizlemenin çevikliğin yeniden düzenlenme evresinde tipik olan bir şey olduğunu düşünüyorum. Yavaş yavaş Cxx standardını elde etsem de, üretim kodunda ustalaşmak için sahip olduğum kavramları kullanma riskini almak yerine anladığımı kullanmayı tercih ediyorum. Arada bir yeni şeyler deniyorum, ancak genellikle yanımda olan oyun projelerinde, sadece bu amaç için.

[değiştir] Gnat'ın önerisinin [1] soruyu sormaya başlamadan önce yaptığım araştırmada görünmediğini açıklığa kavuşturmak istiyorum. Bununla birlikte önerisi sorunun bir yönünü kapsamasına rağmen, bağlantı kurduğu soru sorumun kalbini yanıtlamıyor, sadece bir kısmı. Benim sorum, kodlama stilime verdiğim yanıt ve farklı kodlama stilleri ve (belirgin) beceri seviyelerini kullanma konusundaki profesyonel yönler. SO ile ilgili önceki soruma ve bu duruma bir cevap olarak yanıt veriyor. [/Düzenle]

O zaman soru şudur: Neden kodlama stilinizi kullanmayan birini beceriyor?

Benim için eldeki konular / alt bölümler:

  • Yeniden yapılandırma daha sonra daha sağlam hale getirirse, prototip durumlarda daha fazla hataya açık kod kullanmak neden kötü bir programlama uygulaması olsun?
  • C ++ ile yazılmış program Java ile yazılmış gibi nasıl olabilir? Bunu kötü bir program yapan nedir (şu anki tarzın amacını ve iyileştirilmesi planlanan çalışmayı belirttiğimi düşünürsek)?
  • Belirli bir programlama paradigmasında (örneğin OOP / DP) kullanılan bir yapı kullanmayı seçersem nasıl kötü bir profesyonel olurum?

[1] Hızlı ve hatalı bir araç geliştirin, ardından hataları düzeltin veya her kod satırı için yavaş, dikkatli olun.


5
Bu soruyu C ++ Lounge’daki arkadaşlara sormakta daha iyi olabilirsiniz. Önce aleve dayanıklı elbiseni giy.
Robert Harvey,

48
C ++ millet programcılar arasında sıradışı bir cins. Java araç kitiniz, herhangi bir takım dükkanında çalışacak yastıklı deri çantadaki tanıdık araçlara sahip, mantıklı, iyi anlaşılmış bir alet kutusudur. C ++ bir rip testeresi, elektrikli matkap ve C + 'nin kalabalığının ninjalar gibi işleyebileceği kimsenin tanımadığı bazı aletler. Biri içeri girdiğinde onları sıkıntıya sokar ve bir aleti rafa yanlış yere koyar. Programcıların "iki kez ölçüsü, bir kere kesildi" dir.
Robert Harvey,

13
Belki FORTRAN gibi yazılmış olan Java koduna vereceğiniz tepki aynıydı: tek bir sınıftaki tüm kodlar, koleksiyonlar yok, sadece sabit boyutlu diziler, intgerçek uzunluğu takip etmek için ayrı değişkenler.
kevin cline

14
Eğer C ++ gibi Java yazarsanız, programınızın olabileceğinden daha düşük performans göstermesini sağlayacak olan çok fazla yığın tahsisi ile sonuçlanacaksınız. Diller, belirli kalıpları tanıtmak için tasarlanma ve optimize edilme eğilimindedir ve bu kalıpları kırırsanız, işler sizin için daha da kötüleşir.
Robot

5
Bir tür yardım almak için çevrimiçi kod gönderdiniz. Tarzınızla ilgili tüm geri bildirimleri istemediğinizi / beklemeyeceğinizi fark ediyorum, ancak hiç yardım istemez misiniz? İyiyi kötüyle alırsın. Programcılar koddaki hataları aramak zorundadır; Yaptığımız şey bu.
JeffO

Yanıtlar:


26

Söz konusu kodu görmeden, C ++ 'da Java kodunu diğerlerinden daha kötü yazmanın birkaç yolu vardır.

  1. Bir uçta, kaynağınızı Java gibi düzenliyor: tek bir dosyadaki her şey, sınıf tanımı içindeki her şey, vb.
    class HelloWorldApp {
    public:
        void main() {
            cout << "Hello World!" << endl;
        }
    };
    Java kaynağı bu şekilde ortaya konacaktır. C ++ 'da teknik olarak yasal, ancak her şeyi başlık dosyasına koymak ve satır içi her şeyi (sınıf bildirgesinde tanımlayarak) korkunç bir stildir ve derleme performansınızı öldürür. Yapma
  2. Aşırı derecede OO - Java'da, her şeyin bir nesne olduğu Adların Krallığıdır . İyi (yani, deyimsel) C ++ kodunun, her şeyi bir nesneye sıkıştırmaya çalışmak yerine, ücretsiz işlevler, şablonlar vb. Kullanma olasılığı daha yüksektir.
  3. Hayır RAII - Bundan zaten bahsettiniz - akıllı işaretçiler yerine işaretçiler ve el ile temizleme. C ++ size RAII ve akıllı işaretçiler gibi araçlar sunar, çok iyi (yani, deyimsel) C ++ kodu bu araçları kullanır.
  4. Gelişmiş C ++ yok ​​- Java ve C ++ temelleri yeterince benzer, ancak daha gelişmiş özelliklere (şablonlar, C ++ algoritmalar kütüphanesi vb.) Girdiğinizde, ayrılmaya başlarlar.

Bunların hiçbiri dışında, bunlardan hiçbiri C ++ programını kötü bir program yapmaz, ancak C ++ programcısı olarak çalışmayı tercih ettiğim türden bir kod değildir. (Ayrıca deyimsel olmayan veya C tarzı Perl, deyimsiz Python, vb. İle çalışmaktan da hoşlanmam.) Bir dilin kendi araçları ve deyimleri ve felsefesi vardır ve iyi kod kullanmaya çalışmak yerine bu araçları ve deyimleri kullanır. En düşük ortak payda veya başka bir dilin yaklaşımını yeniden üretmeye çalışmak. Deyimsel olmayan bir kodu belli bir dilde / problem alanında / kimseyi kötü bir programcı yapmazsa, bu dil / problem alanında / ne olursa olsun öğrenmesi gereken daha fazla şey olduğu anlamına gelir. Ve bunda yanlış bir şey yok; Daha öğreneceğim çok şey var ve C ++ 'ın öğrenecekleri çok fazla şey var.

Belirli bir hataya açık kod yazma sorunu ile ilgili olarak, daha sonra temizlemek niyetiyle, siyah beyaz değil:

  • Bazı prototip kodları, olası her istisnayı ve olası her köşe durumunu ele almazsa, bu beklenen bir durumdur. Çalışmasını sağlayın, sonra sağlam çalışmasını sağlayın. Sorun değil.
  • Bazı prototip kodları sadece kötü bir stil veya kötü bir tasarımla yazılmışsa (verilen dil ve deyimler için kötü, problem için temel olarak kötü bir tasarım, vb.) kavram kanıtı, hiçbir şey kazanmıyorsun.

Örnek olarak ham işaretçileri akıllı işaretçilere karşı kullanmak için, eğer C ++ 'da çalışacaksanız, RAII ve akıllı işaretçileri kullanmak, kod yazmanın daha sonra geri dönüp temizlemekten daha hızlı olması gerektiği kadar temeldir. Yine, bunu yapmamak, birinin kötü bir programcı, profesyonelce olmadığı vb. Anlamına gelmez, ancak daha fazla öğrenilecek bir şey olduğu anlamına gelir.


11
deyimsel perl var mı?
Cırcır ucube

21
@Hayır "Bu vidayı bükülmeden duvara nasıl sıkarım ?" herkes sana çekiç kullanmamasını söyleyecektir.
Sjoerd

9
@Onno C ++ 'da, işaretçiler ve newpowertools olarak kabul edilir. Otomatik depolama el aletidir.
Sjoerd

9
@Hayır: C ++ programlama kurslarının modern deyimleri benimsemelerinde gecikme eğiliminde olduğunu ve C ++ 'ın icat edilmesinden bu yana C ++' ın da büyük ölçüde geliştiğini fark etmelisiniz.
Bart van Ingen Schenau

7
C ++ 'ın tarihi ve dilin daha gelişmiş özelliklerinden birçoğundan önce dili öğrenen çok sayıda kodlayıcı göründüğü için, hala on yıl önce yazdıkları gibi yazılan insanlar tarafından yazılmış birçok berbat C ++ var. RAII gibi şeylerle ilgili sapkınlık, herkesin modern yöntemleri kullanmasını sağlamakla ilgilidir;
Robot

42

Her programlama dili, genellikle zarif, doğru ve performans koduna yol açacak bir dizi deyim ve en iyi uygulamaya sahiptir. Başka bir dilde mükemmel derecede iyi olan birkaç kötü uygulama:

  • for ($i = 0; $i < 42; $i++) { … }Perl'de yazıyorsanız , ama PHP'de yazmıyorsanız
    (Perl'de değişkenler bildirilmeli ve bu döngüler bir aralıkta yinelenmeli) diye bağırırım.
  • new Foo()C ++ ile iyi bir sebep olmadan yazıyorsanız ama Java'da yazmıyorsanız ağlarım
    (C ++ çöp toplama özelliğine sahip değildir, bu nedenle RAII kullanılmalıdır. Noobs aksi takdirde bellek sızdırıyor)
  • C89, Pascal veya JavaScript hariç tüm değişkenlerinizi fonksiyonunuzun üstünde bildirirseniz cüruf edeceğim.
  • Tüm işlevlerinizi Python'da bir sınıfa koyarsanız, ancak Java'da
    (Python “OOP” yu zorlamak yerine çok paradigma bir dildir ve işlevleri en üst düzeyde destekler) koyarsanız yüz yüze geleceğim.
  • return nullScala'da ağlarsınız, ancak C benzeri bir dilde
    olmazsanız (Scala'nın bir Optiontürü olduğundan) ağlayacağım
  • Java'da özyinelemeli bir algoritma yazarsanız, ancak OCaml'de yazmazsanız şikayet edeceğim
    (çünkü Java yığını hızlı bir şekilde taşar, oysa OCaml'de kuyruk çağrısı optimizasyonu vardır)
  • ...

Yeni bir dili bildiğiniz bir şeymiş gibi kullanmak kolaydır ve şansla bile işe yarayabilir. “Fortran'ı herhangi bir dilde yazabilirsin”. Ancak, X'in sunduğu belirli özellikleri görmezden gelmek istemezsiniz, çünkü X'in U'ya göre bir avantaj sağlaması ihtimali iyidir.

Kullanılabilir kütüphaneleri ve eldeki iş için en uygun uygulama ortamları için kullanılacak dili seçiyorum ” - ancak bu dilin X eldeki iş için U diline nazaran daha iyi olup olmadığı aynı zamanda bu dilin ne kadar aşina olduğuna da bağlıdır. onu iyi kullanmak için yeterince tanımak ne kadar sürer. Gerçekten eski kalem bıçağınızı istediğinizde elinize tam oturduğundan, en hızlı şekilde odun kestiği için ağır bir testere vermezsiniz. Tabi aslında bir ağacı kesmek istemiyorsan.

Ancak sorunuz kültürel bir mesele hakkında daha fazla : en iyi uygulamaların öğrenilmesi çok zaman alıyor ve yeni başlayanlar en çok soruyu soruyorlar, oysa guruları onlara cevap veriyor. Fakat bir guruya açık olan bir acemiye açık değildir ve gurular bazen bunu unuturlar. Bir acemi olarak, çözüm soru sormayı bırakmamaktır. Ancak, en iyi uygulamaları öğrenme ve uygulama açıklığı gösterilebilir, örneğin , kodunuzu başkalarına göstermeden önce olabildiğince temizlemeye çalışarak . Çoğu dil, tüm öğrenme eğrisi aslında çok uzun olsa bile, öğrenmesi kolay birkaç temel en iyi uygulamaya sahiptir.

Yaygın bir sorun, programlamaya yeni başlayanların herhangi bir girintiyi veya diğer biçimlendirmeyi dikkate almaması ve programlarının çalışmadığı için karıştırılmalarıdır. Benim de kafam karışır ve bir programı anlamanın ilk adımı mükemmel bir şekilde yerleştirilmiş olmasını sağlamak. Sonra unutulmuş bir kapanış teklifi veya eksik bir virgül gibi basit hatalar aniden ortaya çıkar. Zaten iyi biçimlendirme uyguladığınıza inanıyorum ve burada diğer en iyi uygulamalar için bir metafor: en iyi uygulamalar hataları önlüyor, en iyi uygulamalar hataları bulmayı kolaylaştırıyor, en iyi uygulamaları uygulamak sorunu bulmadan önce geliyor .

“Sonra düzelteceğim” demek çok ucuz, şimdi düzeltmek sorununuzu çözebilirdi (ayrıca, bu “temizlik aşaması” asla gelmeyebilirdi, bu nedenle tek sorumlu seçenek doğru yapmaktır. İlk kez). En azından, başkalarından yardım istemeden önce kodunuzu olabildiğince iyi hale getirmeye çalışmak, kodunuzla ilgili sebep yapmalarını kolaylaştırır, bu da kibar bir şeydir.


Yaptığın bazı noktalarda oldukça haklısın, ama sonunda işarete çarptığını sanmıyorum. Bilgiyi edinecek deneyime sahip olmadan önce bilgiyi edindiğinizi varsayıyorsunuz.
Onno

4
@Onno Ana noktalarım (sorduğunuz soruları cevaplayan), bir dilden gelen alışkanlıkları aktaramayacağınız ve bunun bir diğeri için en iyi uygulama olduğunu ve baştan itibaren temiz kod yazmaya çalışmanın temizliği tercih edebileceğini varsayalım. daha sonra. Kodu temizleme - elinizden gelenin en iyisini yapmak için - başkalarından yardım istemeden önce bir zorunluluktur ( iyi kod parçacıklarıyla ilgili ipuçları için sscce.org adresine bakın ). SO üzerine “lütfen bunu düzeltin” ile birlikte çöp kodunu atmak, özellikle daha iyisini biliyorsanız kabul edilemez.
Amon

2
Ancak, bahsettiğiniz soruya ilişkin : jm666'nın cevabı kilit bir nokta içeriyor: guru “kendin X-guru olmak istemiyorsan neden X hakkında soruyorsun?” Diye düşünürken kendimi bu yararsız zihniyette çok sık buluyorum. . Bunu etkisiz hale getirmenin olası bir yolu, hala öğrenme eğrisinin en başında olduğunuzu ve bunu daha sonra ele alacağınızdan bahsetmektir, fakat şu anda elinizde bu daha acil bir soru var. Ancak, bu bir iletişim sorunu değil, programlama sorunu.
Amon

6
Hem C ++ hem de C # sırasıyla optional<T>ve vardır Nullable<T>. Ayrıca, pratik olarak herkes C ++ 'da RAII olmadan noob ya da değil bellek sızdırıyor.
DeadMG

Bir bloğun başında değişkenleri bildirmenin genellikle kodunuzu çoğu dilde okunmasını kolaylaştıracağını düşünüyorum. Bu sayede, tüm değişkenlerinizin hangi tip olduğunu hatırlamakta yardıma ihtiyacınız olduğunda tam olarak nereye bakacağınızı bilirsiniz.
Relish

12

Sert bir C ++ geliştiricisi değilim, ama ...

Yeniden yapılandırma daha sonra daha sağlam hale getirirse, prototip durumlarda daha fazla hataya açık kod kullanmak neden kötü bir programlama uygulaması olsun?

Akılda tutulması gereken bir şey C ++ bir hata genellikle "tanımsız davranış" anlamına gelir. Güvenli bir dilde olabilecek en kötü şey, programınızı derhal sonlandırmak bir istisnadır. C ++ 'da bir segfault alırsanız şanslısınız. Programınız tamamen yanlış bir şeyler yapmaya devam ediyor. Ayrıca, bir süre boyunca doğru şekilde davranabilir ve daha sonra hataları ortaya çıkarabilir veya her zaman doğru şekilde davranabilir, ancak sonunda tüm hafızanızı tüketebilir.

Her durumda, program yürütmesini raylardan tamamen ve keşfedilmemiş bölgelere çekmek tek bir hata alır. Tam zamanlı C ++ geliştiricisi için "temel durum", "tanımsız davranış veya bellek sızıntısı olasılığı yok" anlamına gelir.

C ++ ile yazılmış program Java ile yazılmış gibi nasıl olabilir? Kötü bir program yapan nedir?

Bunun büyük ölçüde spekülatif ve fikirli olmayacak bir cevabı olduğunu sanmıyorum. Buna rağmen benim üstüme çıkmamı istiyorsan, Java, her şeyin bir nesne olması gerçeğine benzeyen bir çift antipatterns kullanma eğilimindedir. Diğer dillerde Eğer bir işaretçi, funktoru veya fonksiyonunu geçerdi yerlerde, Java genellikle anlamsız ve dar kullanışlı ton bulmak ThingDoers, FooFactoriesve IFrobnicatorskılık değiştirmiş sadece fonksiyonlardır.

Benzer şekilde, diğer dillerde basit bir tuple veya isimsiz bir yapı geçirebileceğiniz durumlarda, Java'da yalnızca 2 nesneyi basit bir veri konteynerine bir araya getirmek için Java, 30+ satırlı bir NamedThing sınıfını ayarlayıcılar, alıcılar ve Javadocs ile önceden tanımlamanızı gerektirir. Java'nın göreceli özellik eksikliği programcıları bazen işleri halletmek için nesne yönelimli çift backflips yapmaya zorlar. Sonuçta ortaya çıkan kod nadiren Java dışında aptalcadır.

Sonra C ++ 'da hafızayı elle yönetmek için çok basitleştirilmiş bir nesne grafiğine ihtiyacınız var; genellikle bir nesne tam olarak bir başka nesneye aittir. Java'da, bu kadar sıkı kısıtlamaları takip etmeniz gerekmez, çünkü çöp toplayıcı, başka referanslar olmadığında işlerin temizlenmesini sağlar. Dolayısıyla, kodu Java'dan C ++ 'a çevirirseniz, kesinlikle hatalı bellek yönetimi riski vardır.

Sonunda, sadece elitizm olabilir. Çoğunluğu yaratıyormuş gibi davranmayacağım, ancak kesinlikle bazı C ++ geliştiricileri arasında "elimi tutacak ve beni aptalca şeyler yapmaktan alıkoyacak bir dile ihtiyacım yok" duygusu gördüm. Akıllarında C ++ "gerçek" bir dildir ve kendi kendine özgü ifadelerini kaldıramazsan, "gerçek bir programcı" değilsindir.


1
Bunun çoğu Java 8 ile azaltılabilir - Lambdas çoğu günü kurtarmak için yola çıkar. :-)
Martijn Verburg

@MartijnVerburg Anlaşıldı, orada ileriye doğru büyük bir adım. Ancak teknolojik problemler çözülmesi kolay olanlardır! Eski alışkanlıklar zor ölür ve damgalamalar daha da zorlaşır. Heck, bazı insanlar Java'nın bu "yeni" özelliklerin hiçbirine ihtiyaç duymadığından ve bir sonraki C ++ olma yolunda olduğundan şikayet edecek kadar ileri gidecek.
Doval

Evet Hep başımı sallamak - Java edecek uzun vadeli beygir olduğunu bilerek hep evrim geçirmekte daha yavaş dışındaki diller olarak. Ancak JVM artık daha hızlı atlayabilir ve biraz daha hızlı bağlanabilir; bu, Lambdas gibi şeylerin sonunda dile gelmesini sağlar.
Martijn Verburg

6

Biraz konu dışı cevap ...

Endişelenmeyin - bu, herhangi bir uzman topluluğunda ortak bir "davranış" dır. Ve dürüst olmak gerekirse, eğer herhangi bir dilde iyiyseniz ve “garip” olan bir kodla karşılaşacaksınız, muhtemelen onu da eleştireceksiniz. (çünkü, ÖĞRET istiyorum).

Perl dünyasındayım - ne zaman böyle bir şey göreceksiniz:

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

yerine:

my $str = join '', @array;

emin olacağınız yorum - (oku: yazara öğretmek) joinişlevi hakkında.

Neyse, çok fazla eleştiri hiç ters olduğunu ve iyi örneklerinden birini yanındadır: (: den yakaladı http://perl-begin.org/humour/#How_can_I_switch_off_the_T.V..3F )

(Bu bit 23 Mart 2011 tarihinde isimsiz olarak bir pastayı yayınlamıştır. Bazı düzenlemelerden sonra posterity için buraya yerleştirilmiştir.) - biraz da düzenlendi

Soru: TV'mi nasıl açabilirim?

OP ne duymak istiyor?

Örneğin: TV uzaktan kumandanızın açma / kapama düğmesini bulun ve buna basın. Düğme genellikle kırmızı renktedir ve uzaktan kumandadaki en üst satırda bulunur.

#Perl uzmanının cevabı: İlk olarak, "aç" ile ne demek istiyorsunuz? İlk önce onu tanımla. TV'nizi, TV'nizi ve oturma odanızı temizleyin.

... bir nopaste sonra:

Odan çirkin. Ve TV berbat görünüyor. Bay Clean'ı ekranda kullanın ve önce oturma odanızı temizleyin. İki yerine üç temizlik bezi kullanın. Gerçekten istemediğiniz sürece, HDMI kullanın ve asla scart (?) Konektörlerini kullanmayın. TV uzaktan kumandanızın okunamayan düğmeleri var, önce temizle. Sen bir acemisin, o yüzden oku:

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.html

IRC konuğu: Ancak, bir TV uzmanı olmak istemiyorum.

Cevap: Neden televizyonu açmak istiyorsun?


1
Bu cevap konu dışı değil . Birisinin neden geleneksel olmayan bir dili kullanmayı eleştirdiğini ve zaman zaman otomatik eleştirinin neden çok uzağa gidebileceğini açıklıyor. Bunu sevdim.
trichoplax

1

Yeniden yapılandırma daha sonra daha sağlam hale getirirse, prototip durumlarda daha fazla hataya açık kod kullanmak neden kötü bir programlama uygulaması olsun?

Daha sonra düzeltme yapmak amacıyla hızlı ve kirli yazı yazarken düzeltmeniz gereken bir şeyi unutma tehlikesi vardır.

C ++ ile yazılmış program Java ile yazılmış gibi nasıl olabilir? Bunu kötü bir program yapan nedir (şu anki tarzın amacını ve iyileştirilmesi planlanan çalışmayı belirttiğimi düşünürsek)?

Java'da belirli bir nesnenin kimin sahibi olduğunu düşünmek zorunda değilsiniz, sadece referansı geçip hiçbir şey yokmuş gibi unutursunuz. Bununla birlikte, C ++ 'da, nesnenin kime ait olduğu ve temizlemekten kimin sorumlu olduğu konusunda net bir tanım olması gerekir.

Belirli bir programlama paradigmasında (örneğin OOP / DP) kullanılan bir yapı kullanmayı seçersem nasıl kötü bir profesyonel olurum?

Yapmazdın; C ++, çok paradigma bir dildir, OOP'u oldukça iyi desteklemektedir ancak birçok başka şey de yapabilir. Bununla birlikte, birçoğu tahtaya sivri bir başak sürmeniz gerektiğinde çekiç çekmek yerine, iş için doğru aleti kullanmaya başlar.

Kötü bir yanıt almanızın nedeni, SO'da çalışan kişilerin çoğunun, sorduğunuz dilde ne kadar aptalca kodlayabileceğinizle becerilerinizi yargılamasıdır. C ++ 'a aşina olan insanlar, geçmişte onları ısırmış bir şeye benzeyen kötü bir kod gördüklerinde diz çökme eğilimindedirler.


İyileştirmeyi unutmanın bir sorun olabileceğini görebiliyorum, ancak uzun bir görev listesi tutuyorum ve bu tür işler için yapılacaklar etiketi eklemeye çok disiplinliyim. (VS'yi bu yüzden seviyorum, iş yönetiminde oldukça iyi) Dokümantasyon için aynı. Bunun için belgeleri yazmadan önce bir kod satırı yazmıyorum. Mülkiyet sorusuna gelince, sekans diyagramları nedeniyle, kimin kiminle bağlantısı olduğuna dair iyi bir fikrim olduğunu düşünüyorum.
Onno

1
@Onno: Açıkçası, hiç kimse kişisel olarak bu şeyleri izlemekte ne kadar iyi olduğunuzu bilmiyor veya umursamıyor . Java ya da C'ye benzeyen C ++ yazan insanların büyük çoğunluğu neredeyse o kadar titiz değildir. İlk seferinde işleri doğru yapmayı öğrenmeleri, daha sonra geri dönüp düzeltmek için kendilerine bir not yazmaktan çok daha iyidir, çünkü deneyimler pratikte asla yapamadıklarını gösterir.
cHao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.