Aşırı kullanılmış veya kötüye kullanılan programlama teknikleri [kapalı]


38

Programlamada, fazla kullandığınız (IE, olması gerekenden çok daha fazla kullanıldığı) veya kötüye kullanıldığı veya her şey için biraz kullanıldığı, ancak insanların denediği sorunların çoğu için gerçekten iyi bir çözüm olmayan herhangi bir teknik var mı? onunla çöz.

Düzenli ifadeler, bir çeşit tasarım deseni veya belki bir algoritma veya tamamen farklı bir şey olabilir. Belki de insanların çoklu miras vb. Kötüye kullandığını düşünüyorsunuz.


33
IE’nin olması gerekenden çok daha fazla kullanıldığını kabul ediyorum, ancak bu öncelikle programcılar tarafından değil. . .
Eric Wilson

7
@FarmBoy - IE’yi kastettiğini düşünüyorum: “Yani” sadece Latince’de yazılmış olan “id est” anlamına gelir.
Raphael

Şimdi düzeltildi :)
Anto

4
Herhangi bir teknik (ve genellikle kötüye kullanılırsa), sadece bir sonraki gümüş kurşun olarak sunulmak zorundadır ve her problemi bir çivi olarak ele alan birini (metaforları karıştırmak için) bulacaksınız.
ChrisF

8
@Rapheal - Tabii ki şaka yapıyordum. Eğitim için teşekkürler.
Eric Wilson

Yanıtlar:


73

Koddaki Yorumlar

Sadece Üniversite Profesörlerinin, öğrencilerine, aşağıdaki kodun bir döngü için olduğunu söyleyen, 10'dan 1 satır yazıp, x'den x'e kadar olan sayıları yazdıklarını söylemeleri gerekmediğini anlamalarını diliyorum. Bunu kodda görebiliyorum!

Onlara önce kendi kendini belgelendirme kodunu yazmayı, ardından neyin ikinci kez kendi kendini belgeleyebileceğinin uygun olmadığını yorumlayın. Yazılım dünyası daha iyi bir yer olurdu.


26
Kendini belgeleyen kod değil. Ayrıca profesörler, öğrencilere problemi kavramsallaştırmayı ve ona nasıl yaklaşacaklarını öğretmek için yaparlar. Ek olarak, hiçbir zaman çok fazla dokümantasyondan şikayetçi olmadım. Uyarı, belgelerin doğru olması.
Woot4Moo

24
@ Woot4Moo: Okursanız Clean Code, Fowler, güncel belgelerin dokümantasyondan daha kötü olduğunu ve tüm yorumların eski olma ve belgeledikleri koddan uzaklaşma eğiliminde olduğunu açıkça belirtir. Bu kitabın tamamı kendi kendini belgeleyen kodun nasıl yazılacağıyla ilgili.
Scott Whitlock

12
Yorumların kodla değiştirilmesini öğretmek iyi bir başlangıç ​​olur ...
Shog9

15
+1. Aslında gerçek dünya kodunda şunu gördüm: "loopVar ++; // increment loopVar". AAAAAAAAAAAAARRRRRGH!
Bobby Tables

7
@Bill: Benim görevim, göreceli olarak karmaşık olsalar bile, genel mantık ve kontrol yapılarını belgelendirmenize gerek olmaması gerektiğidir. Temel olarak, dili bilen iyi bir geliştiricinin kodu analiz ederek çalışabilmesi gereken herhangi bir şeyin yorumlanması gerekmez. Örneğin. İçlerinde bir miktar kırılma olan döngüler için iç içe geçmiş bir dizi, vb. “Eğer yeni bir programcı yarın şirkete başlar ve koda bakarsa, yorum püf noktaları olmadan ne anlama gelir?”
Bobby Tables

57

Singleton tasarım deseni.

Elbette, faydalı bir örnek ama yeni bir programcı bu model hakkında her öğrendiğinde, oluşturduğu her bir sınıfa uygulamaya çalışıyor.


Bu kötü tasarlanmış mazereti her gün bir çerçeve için kullanıyorum. codeigniter.com/user_guide/libraries/email.html OOP ile önekleme yapmakta olduklarını düşünüyorlar $this->. PHP çürük bir dildir, bu yüzden çerçevelerin mükemmel olmasını bekleyemiyorum.
Keyo

7
Bence bir singleton uygulayan ve tövbe etmeyen herhangi bir programcının, (veya kendisinin) taahhüt ettiği günah (lar) için ateşli bir cehennemde yanacağını düşünüyorum.

2
Profesyonel kariyerimde (çok görevli bir bağlamda) bir singleton uygulamıştım ve günahım için tekrar yazarak tövbe etmek zorunda kaldım.
Spoike

3
Singletons birkaç şey için faydalı olabilir, fakat neredeyse her zaman olması gerekmediğinde kullanılır. Bu, tekillerin asla kullanılmaması gerektiği anlamına gelmez - bir şeyin kötüye kullanılması, doğru kullanılamayacağı anlamına gelmez.
konfigüratör

2
@Rapahel: İşte bu yüzden tasarım desenlerini çalışmanın iyi bir şey olduğuna inanmıyorum.
konfigüratör,

53

Aptal programlamayı korumak için en kötü şey. herşeyi bir denemeye koymak ve mandalla hiçbir şey yapmamak

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

Hiçbir şey yapmayan ve aptal mantığı ele almak için tasarlanmış bir deneme yakaladığımda titriyorum. Genel olarak, denemelerde yakalamalar fazla kullanılmaktadır, ancak bazı durumlarda çok faydalıdır.


4
Komik bir şey - Sadece yüzlerce kez yapılan ve iyi bir sebeple bir dosya düzenliyordum. Beklendiğinde, çeşitli yöntemlerin bir istisna oluşturduğunu test eden bir birim sınama dosyasıdır. Deneme bloğu bir çağrı içeriyor ve "beklenen atış olmadı" raporu. İstisna beklenir ve doğrudur, bu nedenle düzeltici bir eylem yoktur. Açıkçası, birim testleri özel bir durumdur, ancak gerçek kodda benzer vakalar yaşadım. Kırmızı bayrak, evet, ama kesin bir kural değil.
Steve314

5
@ Açıkladığınız durum nadir bir kenar koşuludur. Düşünebildiğim bir diğer kod günlüğe kaydetme kodudur - kendi kendine günlüğe kaydetme başarısız olursa, istisnayı günlüğe kaydetmeye çalışmanın veya uygulamayı durdurmanın bir anlamı yoktur.
dbkk

1
@dbkk - son koşul üzerinde anlaştılar ve gerçekten bir istisna yakalamanız gerektiğinde ancak düzeltici bir eyleme ihtiyaç duymadığınızda, bunu yalnızca sakinleşmek için gerekliyse, kilitleme bloğuna bir yorum ekleyerek eklemenizi isterim. Maintainers. Ünite testlerinde çok nadir değildir, bu yüzden bu durumda yorum özelliğini bırakacağım.
Steve314

5
hata devam sonraki
jk.

2
@ jk01 - bir istisna (zorunlu olarak) bir hata değildir. Herhangi bir koşulun bir hata olup olmadığı, içeriğe bağlıdır. Örneğin, dosyaya ihtiyacınız yoksa "dosya bulunamadı" bir hata değildir. Belki de var olan veya bulunmayan isteğe bağlı bir ayar dosyasıdır ve dosya mevcut değilse, varsayılan ayarlarınızı yerinde bırakabilirsiniz (bu nedenle yakalama işleminden sonra düzeltici bir işlem gerekmez).
Steve314

47

Sorunlarınızı zor yoldan çözmek yerine çözmek için StackOverflow'a güvenin.

SO hakkında bilgi zengini bulan yeni programcılar (çok sıkça) düşünmeden ve denemeden önce görevlendirirler.

Günümde kitaplardan kod yazmak zorunda kaldık, internet yok, SO yok. Şimdi çimlerimden defol.


28
Kabul etmeliyim ki, SO ile ilgili bazı soruların cüretine katlanıyorum. Ya her gün defalarca soruldukları ve kesinlikle hiç aramadıkları için; veya daha da kötüsü, topluma ücretsiz bir dış kaynak hizmeti olarak davranıyorlar.
Orbling

2
@dbkk: stackoverflow.com/questions/4665778/… -> ilk yorum "bunu hiç denediniz mi?"
Matthieu M.

5
Kitaplardan öğrenmeye başladım, ancak bir kez bir vakfım olduğunda çevrimiçi forum tartışmalarından hemen hemen her şeyi öğrendim. Sormakla değil, çoğunlukla (ve ilk başta, yalnızca) okuyarak. Bu yöntem bana çok sayıda programlama dili öğretici derinlikte (çok sayıda köşe ve korniş ile) öğretti ve bence bu hiç de kötü bir yöntem değil.
Konrad Rudolph

1
@Konrad Rudolph: Bu yöntem iyi ve akıllı, soruları okuyor, iyi araştırıyor. Soru, en iyi cevap veren kişinin cevaplarını anlamak için bir çerçeveye sahip olduğu zaman yapılır. Çok sık insanlar, anlamadıkları kapasiteye (henüz) sahip olmayan sorular soruyorlar.
Orbling

3
Buradaki sorun SO'nun basit google aramayla yanıtlanabilecek çok kolay soruyu sormak / cevaplamak için bir çok cevap vererek teşvik etmesidir. çok zor bir soru insanlar sadece gerçekten istedikleri için cevap verirler.
IAdapter

36

Açıkça OOP. Bu çok değerlidir, ancak yanlış kullanıldığında aksi takdirde kodun kolayca silinmesini engelleyebilir (bazı S4 programlama örnekleri akla gelir) ve gereksiz olan ve performans konusunda size zaman kazandıracak muazzam bir ek yük sağlayabilir.

Başka bir şey de (örneğin Perl'de) OOP genellikle aynı şeyi başka bir şekilde yazmaya başlar: result = $object ->function(pars)Bunun yerine result = function(object, pars)bazen mantıklıdır, ancak prosedürel programlama ile karıştırıldığında kodu okumayı oldukça kafa karıştırıcı hale getirebilir. Ve bunun dışında, tasarımı iyileştirmediği durumlarda daha fazla ek yüke giriyorsun. Ayrıca, singleton modeli hakkında söylenenlere de gelir: Kullanılmalı, ama her şeyde kullanılmamalıdır.

OOP'u kendim kullanıyorum, ancak benim alanımda (bilimsel bilgi işlem) performans çok önemli ve bugünlerde tüm öğrenciler Java kullandıkça OOP sıklıkla kötüye kullanıyor. Kavramsallaştırmak, vb. İçin daha büyük sorunlarla başa çıkmak için harikadır. Ancak, BioPerl'deki örneğin DNA dizileriyle çalışıyorsanız, nesneleri her seferinde kullanmak ve alıcılarla ve ayarlayıcılarla tutarlı çalışmak hesaplama süresini on kat artırabilir. Kodunuz birkaç saat yerine birkaç gün çalıştırıldığında, bu fark gerçekten önemli.


6
@Craige: OOP'u kendim kullanıyorum, ancak benim alanımda (bilimsel bilgi işlem) performans çok önemli ve bugünlerde tüm öğrenciler Java kullandıkça OOP sık sık suistimal ediliyor. Kavramsallaştırmak, vb. İçin daha büyük sorunlarla başa çıkmak için harikadır. Ancak, BioPerl'deki örneğin DNA dizileriyle çalışıyorsanız, nesneleri her seferinde kullanmak ve alıcılarla ve ayarlayıcılarla tutarlı çalışmak hesaplama süresini on kat artırabilir. Kodunuz birkaç saat yerine birkaç gün çalıştırıldığında, bu fark gerçekten önemli.
Joris Meys

1
@Craige: Metod zincirleme (gibi Foo.DoX().DoY().DoZ()) güzel, ama kesinlikle bir şeylere gitmenin tek yolu bu değil. Fonksiyon bileşimi ( doZ . doY . doX $ foomükemmel bir şekilde geçerli bir alternatif.
Anon.

1
@Joris: Uzun zamandır merak ettiğim bir şey (kendim bir biyoinformatik): Eğer performans bu kadar önemliyse, neden Perl'i C ++ yerine ilk sırada kullanıyorsun? Çalışma süresinden 10'luk bir faktörü tıraş etmekten endişeleniyorsanız (geçerli endişe!) C ++ 'a geçmek size anında memnuniyet verir. Tabii ki, dil berbat… ama sonra Perl de… ve C ++ için iyi biyoinformatik kütüphaneler var.
Konrad Rudolph

1
@Konrad: Bu değişir. BioPerl, muhtemelen tüm dillerden biyoinformatikçiler için en fazla pakete sahip (Sanırım Python'un yetişiyor). Ayrıca, Perl'de çok fazla iş yapıldı ve bir senaryoyu uyarlamak, C ++ 'daki her şeyi yeniden yazmaktan daha kolaydır. Son olarak, bir script ne zaman yapılacağına dair tam bir uygulama yazmaz. Sanırım bu yüzden Perl hala bu kadar. Ve dürüst olmak gerekirse, umrumda değil, dili sevdim. Hala dize ve dosya çalışmaları için bildiğim en iyisi. Hesaplamalar açıkça diğer dillerde yapılır ve geriye bağlanır (ki bu oldukça kolaydır).
Joris Meys

1
@Konrad: Bu nasıl yapıldığına bağlı. Her şeyi Perl'de yapmak mümkündür, ancak Perl, özellikle Linux'ta, diğer araçlarla kolayca bağlanabilir. Perl'i genellikle güçlü dize manipülasyonu ve diğer uygulamalara bırakılacak veri kümelerinin kolay kurgulanmasıyla gelişmiş bir bash betiği olarak kullanıyorum.
Joris Meys

27

ASP.NET Webforms'ta birkaç yıl geçirdikten sonra, açıkça söylemeliyim ki:

Akıllı kullanıcı arayüzü

Web formlarında katmanlı, test edilebilir uygulamalar oluşturmak tamamen mümkün olsa da, Visual Studio, geliştiricilerin, tüm UI kodlarının etrafına yerleştirilmiş uygulama mantığıyla, veri kaynaklarına sıkıca bağlı formlar oluşturma yollarını tek tıklatmalarını çok kolaylaştırır.

Steve Sanderson bu anti-paterni Pro ASP.NET MVC kitabında yapabileceğimden daha iyi açıklıyor:

Bir Akıllı UI uygulaması oluşturmak için bir geliştirici önce bir UI oluşturur, genellikle bir tuval üzerine bir dizi UI widget'ı sürükler ve ardından olası her bir tıklama tıklaması veya diğer UI olayı için olay işleyici kodunu doldurur. Tüm uygulama mantığı, şu olay işleyicilerinde bulunur: kullanıcı girişini kabul etmek ve doğrulamak, veri erişimi ve depolaması yapmak ve kullanıcı arabirimini güncelleyerek geri bildirim sağlamak için mantık. Tüm uygulama bu olay işleyicileri oluşur. Temel olarak, Visual Studio'nun önüne bir acemi koyarken varsayılan olarak ortaya çıkan şey budur. Bu tasarımda, hiçbir kaygının ayrılması söz konusu değildir. Her şey birlikte kaynaştırılır, yalnızca meydana gelebilecek farklı UI olayları açısından düzenlenir. Mantık veya iş kurallarının birden fazla işleyicide uygulanması gerektiğinde, kod genellikle kopyalanır ve yapıştırılır, veya belirli rastgele seçilen bölümler statik fayda sınıflarına ayrılır. Birçok bariz nedenden ötürü, bu tür bir tasarım deseni genellikle anti-kalıp olarak adlandırılır.


1
Bir GUI en azından bir tür şartname koduna uyması gerekir. Açıkladığı programcıların, bunun yerine boş bir metin dosyası ile sunulursa daha iyi olacağını sanmıyorum.

4
@ qpr, bunu bilmiyorum. Boş bir metin dosyasına sahiplerse hiçbir şey yapamayabilirlerdi (bu sadece bir bonus olabilir).
Ken Henderson,

WPF kullanmanın birçok yararından biri, MVVM uygulamasının bu anti-paterni smithereenslere ayırmasıdır.
Robert Rossney

2
Bunun bin katı. Tecrübeli .NET geliştiricilerinin bu "kalıba" güvendiğini bile görüyorum, çünkü Endişelerin Ayrılması konusunu anlamak veya onlara bakmaktan daha kolay. Sürükle ve bırak sihirbazlarını kullanmasalar bile, .NET WebForms geliştirmedeki en yaygın "model" kod ardındaki olaylarda her şeyi yapmak ve gerektiğinde kodu kopyalayıp yapıştırmaktır.
Wayne Molina

23

Bunu zaman zaman görüyorum ve genellikle boolean ifadeleri tam olarak anlamadan kaynaklanıyor.

if (someCondition == true)

16
Kodun daha açık hale getirilmesi avantajına sahiptir
Pemdas

7
Sanırım bu soruya bir sıra geldi: programmers.stackexchange.com/questions/12807/…
gablin

5
Bunu yapmam ama cidden, üstesinden gel. Dışarıda çok daha kötü bir şey var. :)
MetalMikester

4
Değişkenlerinizi doğru bir şekilde adlandırdıysanız, örneğin veya boolile başlıyorsanız , kodunuzu daha açık hale getirmeniz gerekmez . ishas= true
Kimse

3
@DisgruntledGoat hiç kullanılmaması gerektiği için
Corey

19

Reimplementing işlevi, ya çünkü varlığının cehalet nedeniyle veya özelleştirmelerin için algılanan ihtiyaç çekirdek (veya başka bir şekilde sağlanan).


2
Öğrenme bir istisnadır. Bir şey okurken, genellikle "tekerleği yeniden icat etmek" yararlı olur.
Saat

Herhalde - yalnızca üretim yazılımı oluştururken bunun geçerli olduğunu belirtmeliydim.
l0b0

1
Bu özellikle güvenlikle ilgili herhangi bir şeyi uygularken kötüdür. İyi güvenlik yazılımı çoğu insanın asla düşünmediği saldırıları önler.
David Thornley

Bu yolu çok yaygın görüyorum. X'e ihtiyacımız var, hadi kendimiz yazalım! Peki ya açık kaynaklı paket Y? Hayır, endüstrimizdeki herkesle aynı olan süper gizli ticari sırlarımız için özel yazılıma ihtiyacımız var, ortak çöp yazılımını kullanamayız!
Wayne Molina

18

Kalıtım.

Zorlama, bir anlam ifade etmiyor.


6
Sorun, sezgisel olarak “is-a” nın anlamlı olması için çok sık ortaya çıkmasıdır (özellikle her uygulama / sözleşme ilişkisi konuşma yoluyla “is-a” olarak ifade edilebilir). Bunun aslında bir hata olduğunu ve miras ve arayüz uygulamasının temelde farklı olduğunu anlamak için OOP'un sağlam bir şekilde anlaşılmasını gerektirir.
Konrad Rudolph

@Konrad - kesinlikle aynı fikirdeyim. İnsanları kompozisyonla başlamaya , arayüzlere geçmeye ve mirası en son düşünmeye teşvik ediyorum . (Tabii ki kural olarak). Ama belki de bu benim VB arkaplan konuşmam ... ;-)
Mike Woodhouse,

1
Bu, büyük ölçüde bir dil tasarım sorusudur. Java veya C # gibi dillerde "mirası tercih etme (uygulama) miras" tercihinin nedeni, uygulama mirasının bu dilleri berbat etmesidir. Bazı insanlar Bertrand Meyer'in Nesne Yönelimli Yazılım Yapımını mirasın aşırı kullanımı için eleştiriyor , ancak gerçekten Eyfel'e (kitapta kullanılan dil) baktığınızda , uygulamanın miras için tasarlandığını fark ediyorsunuz ve bu nedenle miras kullanımının gerçekten uygun olduğunu biliyorsunuz. bileştirme, kompozisyon. Gelen bu durumda, en azından.
Jörg W Mittag

14

Kullanıma hazır yazılımı özelleştirme.

Bunun faydalı olabileceğini kabul etmeme rağmen, şüpheli kazançlar için küçük şeyler yapmak için ne kadar para harcandığını merak ediyorum. Bir şirketin yüzlerce dolar harcayabileceği, daha sonra özelleştirilen, düzenlenebilir ve esnek olduğu için özelleştirilebilen, düzenlenebilir ve esnek bir yazılım. Sonunda, başlangıçta satın alınanları ekleyen tüm yeni kodlar nedeniyle özel bir uygulamadır.


Bunun özel bir uygulamada olması daha olası değil mi?
JeffO

13

Complier'ı hata ayıklayıcı olarak kullanmak.

Tamamlayıcı uyarılarını dikkate almamak veya tamamen kapatmak.

Global değişkenler.


18
"Derleyiciyi hata ayıklayıcı olarak kullanmak" ın nesi yanlış? Çalışma zamanında sorun çıkmadan önce kodunuzdaki hataları işaret edebilen bir derleyiciye sahip olmak çok büyük bir avantajdır.
Mason Wheeler

3
Derleyiciye sözdizimi hatalarımı ve yanlış eşleştirme hatalarımı yakaladım. Davranış hataları için test vakalarına güveniyorum.
gablin

5
Sorun, program doğruluğunu sağlamak için derleyiciye bağımlı olmaya başladığınızda ortaya çıkar. Bu derledi mi? Hayır, bu küçük kısmı birbirine bağlayalım ve bakalım düzeltildi mi. Derlendi mi? Hayır, buraya oraya * ekleyeyim ve derlenip derlenmediğine bir bakalım. ... vb. Açıkçası, bu yazım hataları düzeltmek için yararlı
Pemdas

2
Kodlayıcının karanlıkta bir şey yapmaya çalışırken karanlıkta kör bir şekilde dolaşıyormuş gibi söylüyorsun. IME böyle işler değil; derleyici size yararlı bir hata mesajı verir ve hatanın yerini gösterir ve genellikle bir şey derlemiyorsa, yazdığınız yeni bir kodsa, bu nedenle yanlış olanı ve bir kez işaretlendiğinde nasıl düzelteceğinizi iyi anlayabilirsiniz dışarı. (Etrafta rastgele * ler atıyor olsanız da, derleyici hatalarının fevkalade yararsız olduğu bilinen C ++ 'ta çalışıyor olabilirsiniz, bu yüzden söylediklerim geçerli olmayabilir.)
Mason Wheeler

3
Derleyiciye güvenmek, yeterince güçlü bir tip sistem ve iyi yazılmış bir kod tabanı göz önüne alındığında çok iyi çalışıyor. Tipik olarak, tip sistemi , başka türlü testler yapmanız gerekebilecek önemli kısıtlamaları modelleyebilir (örneğin, zayıf yazılmış sistemlerde). Bu nedenle, dikkatli bir şekilde kullanıldığında, derleyici (ve özellikle türü denetleyicisi), test ve hata ayıklama için harika bir varlıktır ve buna güvenmenin yanlış bir tarafı yoktur . Özellikle, bir derleyicinin yalnızca sözdizimi hatalarını gösterebileceğini söylemek yanlış.
Konrad Rudolph

11

Tüm Tasarım Desenleri.

Tuz ya da şeker gibiler. Yemeğinizdeki bazıları harika yapar, çoğu da yemeğinizi berbat yapar.

Beni yanlış anlama. Tasarım Desenleri harika tekniklerdir. Onları çok kullandım. Ama bazen, problemleri eşleştirmese bile, bu programcıları (bazıları eski patronlarım) bunlarda "tasarım deseni kullanmanız gerekir" diyerek bulurum !!!

Bunun bir örneği “Lineal / Sequential Collections” için daha çok yönlendirilmiş “Ziyaretçi Deseni” dir. Bir keresinde ağaç veri yapısıyla çalışmak zorunda kaldım. Her bir öğeyi "ziyaret etmek" için, tasarım dışı bir model yöntemini kodlarım ve eski bir patron "Ziyaretçi Desenini" kullanmak veya uyarlamak için ısrar ediyorum. Ardından, ikinci bir görüş için fileye göz atıyorum. Eh, diğer programcılar aynı duruma ve aynı çözüme sahipti. Ve buna "Ağaç / Hiyerarşik Ziyaretçi Deseni" adını verin. YENİ Bir Tasarım Deseni olarak

İnşallah, "Tasarım Desenleri" kitabının yeni bir versiyonunda, mevcut olanlara yeni bir kalıp olarak eklenir.


3
Tasarım desenlerini asla kullanmam, ancak bazen kodumda doğal olarak ortaya çıkıyorlar.
konfigüratör

Söyleme nasıl gidiyor? Onları kullandığınızı bilmeden kalıpları kullanmaya başlarsınız, sonra onlar hakkında öğrenir ve her yerde kullanırsınız, sonra ikinci doğa haline gelirler, böylece onları kullandığınızı bilmeden kullanmaya başlarsınız?
Wayne Molina

2
@configurator Tasarım kalıplarını okuduğumda; Ayrıca ben ve diğer geliştiricilerin zaten bazılarını kullandıklarını
keşfederim

9

Akış kontrolü olarak istisnaları kullanma. Bu cevaba benzer ama farklı.

İstisnaları yutmak kötü bir formdur çünkü kodda hata bulmak zor ve gizemlidir. İstisnaları akış kontrolü olarak kullanmak, diğer taraftan, kötüdür çünkü kodu olabileceğinden çok daha verimsiz kılar ve kavramsal olarak özensizdir.

İstisna işleme, bir rakamın beklendiği yerlerde alfabetik karakterde yazan bir kullanıcı gibi şeyler değil, yalnızca istisnai (önceden), öngörülemeyen senaryoları ele almak için kullanılmalıdır. Bu tür istisna istismarı, Java dünyasındaki kötü programcılar arasında oldukça yaygındır.


Verimsiz kod oluşturma istisnaları dilinize bağlıdır - yığın çerçevesi oluşturma vs. vs. (Başka bir deyişle, istisnalar, dilin değil kütüphanenin bir parçasıdır.) Ancak, istisna kontrollü kontrol akışıyla çalışmak kafa karıştırıcıdır : lshift.net/blog/2011/01/04/try-again-with-exceptions shows Son zamanlarda bulduğum bir döngü kullanma özel durumlar.
Frank Shearar

Son paragrafla ilgili olarak, yine dilinize bağlıdır. Common Lisp'teki istisnalar ("koşullar"), çoğu dilin istisnalar hakkındaki fikirlerinin katı bir süpersetesidir. Buradaki örneklere bakınız: gigamonkeys.com/book/… Her şeyde olduğu gibi çok ileri gidebilirsiniz!
Frank Shearar

Okunabilirlik ve bakım kolaylığı performanstan daha ağır basar. Başarı için istisnalar kullanacağım durumlar ("akış kontrolü" ile ne demek istediğinizi varsayalım) çok nadirdir, ancak örneğin karmaşık bir özyinelemeli aramada daha temiz kod verebilirler. Genel olarak, buna katılıyorum. Örneğin, aralık dışına çıkmak için false döndüren yineleyici yöntemlerine sahip kaplar var (yinelemenin sonunda yaygındır), ancak yineleyici "boş" ise (bir tür iç tutarsızlığın muhtemel işareti) bir istisna atar
Steve314

7

Ben aşırı veri gizleme yoluyla esneklik ile gideceğim.

Hepimiz soyutlamanın ve uygulamayı gizlemenin iyi olduğunu biliyoruz, ancak daha fazlası her zaman daha iyi değil. Fazla pişmiş, gereksinimlerdeki değişikliklerle başa çıkamayacak esnek olmayan bir sonuç alabilirsiniz. Değişikliği ele almak için, yalnızca bu değişikliği ele alması gereken sınıfı değiştirmek zorunda kalmazsınız, aynı zamanda veri gizleme katmanlarına rağmen erişilebilir olması için daha önce ihtiyaç duymadığı bilgiler için bir yol oluşturmanız gerekir.

Sorun, her bağlam için tüm doğru dengeyi bulma sorunlarında olduğu gibi, deneyim kazanmasıdır.



6

Değişken hal ve döngüler. Neredeyse hiçbir zaman onlara ihtiyacınız olmaz ve neredeyse her zaman onlarsız daha iyi bir kod elde edersiniz.

Örneğin, bu doğrudan bir StackOverflow dizisinden alınır:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

İkisi de aynı şeyi yapıyor. Ama ne yaptıkları hakkında hiçbir fikrim yok . Neyse ki, soru aslında ne yaptıklarını açıklıyor, dolayısıyla onları şu şekilde yeniden yazabildim:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

Döngü yok, değişken durum yok. Tamam, kesin değil döngüler yok ve döngü sayıcılar yok.

Kod çok daha kısaydı, çok daha basit hale geldi, kodun ne yapması gerektiğinin bir açıklaması gibi (özellikle Ruby'de hemen hemen "yazılan şeyleri türüne göre sırala" diyor) ve çok daha az hata eğilimli hale geldi. Dizinin sonuna kaçma tehlike yok, orada çünkü fencepost hata veya off-by-tek döngü endeksleri ve sonlandırma koşulları hatalardan, hiçbir vardır döngü endeksleri ve sonlandırma koşulları.


“Sabit” ECMAScript'inizin ikinci satırında , listeye iki kez (acc[thing.type] || (acc[thing.type] = []))= = [şey] , unless you want to add konusunun tersine - okunması gerektiğine inanıyorum… Yoksa bir şeyleri mi kaçırıyorum?
Austin Hyde

@Austin Hyde: Haklısın.
Jörg W Mittag

1
Bu ekmascript örneği birçok programcı için anlaşılmaz. Çok fazla sözdizimsel numaraya dayanır. Döngü genç geliştiriciler için açıklık avantajına sahiptir.
Joeri Sebrechts

6

Alaycı. Kodunuza aşırı ayrıştırma için çok fazla yapay gereksinim getirmektedir, aşırı mantı koduna neden olmaktadır ve daha yordamlı veya işlevsel bir tasarım sorununuza daha basit bir çözüm olabileceği zaman OO tarzı tasarımı boğazınıza doğru zorlamaktadır.


Teoride kabul edildi; alaylar faydalıdır ancak bunlara sahip olmanız gerekmez .
Wayne Molina

Alay etmenin istilacılığı, kullandığınız dile bağlıdır. C #, çok istilacı olabilir ve gereksiz arabirimlerin rafları ekler.
Frank Hileman

3

Tüm dünyada Delphi programcıları, son iki yılda, genel Unicode dönüşümü nedeniyle bayt depolamak için karakter dizilerini kullanmanın ne kadar kötü olduğunu öğrendiler.

Ve "yakında" , 64-bit olarak değişiklik yapmak istediğimizde tamsayıları listelerde saklamanın ne kadar kötü olduğunu öğreneceğiz .


2
Bence Borland, temel olarak AnsiString ile aynı olan fakat özellikle de BLOB'larla kullanmak için bir DataString türü bildirmiş ve insanların bunu bildiğinden emin olmuşsa, Unicode sorunlarının büyük bir bölümü asla ortaya çıkmayacaktı.
Mason Wheeler

2

Özellikleri. Bunun tartışmalı olduğunu biliyorum ama özelliklerin .net'te aşırı kullanıldığını hissediyorum.

Bu iki çizgi arasındaki fark nedir?

public string Property { get; set; }

public string Field;

Geliştirici için, fark şudur: kesinlikle hiçbir şey. Derlenmiş form kütüphane yazıyorsanız, eğer öyleyse, birazcık farklıdır ve bu kütüphane programlarında yükseltilmiş olacak, ve sen eklentileri için bir arayüz yazıyorsanız örneğin (programlar kendileri yeniden derlemek edemez yazılımınızın sürümlerinde çalışmalıdır), o zaman ortak alanları kullanmamalısınız, çünkü bunları özelliklerle değiştiremezsiniz. Başka bir durumda, bir alanı veya bir değiştirici olmadan bir otomatik özellik kullanma arasında kesinlikle bir fark yoktur .


1
Kabul; eğer sen% 100 biliyorum sonra bir özelliğe sahip hiçbir neden yok, bir "özellik" ayarı / alma ile bir şey yapmanıza gerek asla. Ancak, bir şeyler yapma ihtimaliniz varsa (örneğin, bir değerin değiştirildiğinin kaydedilmesi gibi) bir özellik kullanmalısınız. Şahsen için yeterince büyük bir fark görmüyorum değil her ihtimale karşı, özelliğini kullanın yapmak (Biliyorum, biliyorum daha sonra değiştirmek ihtiyacını YAGNIancak bu durumda sapan hissetmez maliyet şey yapmıyor)
Wayne Molina

2
@Wayne: Nasıl değişiyor ;için { get { ... } set { ... } }değişen daha başka işe { get; set; }için { get { ... } set { ... } }?
konfigüratör,

Şimdi düşünüyorum da, bu adil bir nokta.
Wayne Molina 13
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.