Kodlama stili ilkesidir - örneğin, tek çıkış ilkesi
1960'ların sonlarında hala tek çıkış mı yoksa çoklu çıkış mı yaptığını söyleyenler hala sıkışıp kalmış durumda. O zamanlar, bu tür bir tartışma bizim yapılandırılmış programlamacılığın başlangıç aşamasında olduğumuz için önemliydi ve Bohm-Jacopini Yapısal Program Teoreminin ardındaki bulguların tüm programlama yapılarına evrensel olarak uygulanamadığını ilan eden çok sayıda kamp vardı.
Uzun zaman önce çözülmesi gereken bir şeydi. Pekala, (Akademi'de ve endüstride kesin olarak kesinleşmek için neredeyse 4 yıl) yerleşmiş, ancak insanlar (kesinlikle profesyonelce ya da karşı olanlar) dikkat etmiyorlardı.
Cevaplarıma gelince, hepsi göreceli (yazılımda ne yok?):
- gerçekten iyi bir şey mi?
Evet. Genel durum için çoğu zaman, kenar durumlara özgü özel uyarılar ve dile özgü programlama yapıları.
Her zaman mı, yoksa sadece bazen mi?
Çoğu zaman.
Gerçekten ne kadar fark eder ki?
Bağlı.
Okunabilen kod, okunamayan bir kod. Arttırılmış karmaşıklık (şu ana kadar bilmemiz gereken hataların ortaya çıkma olasılığını arttırır) - daha basit karmaşıklık (ve ergo, daha küçük hata olasılığı). Derleyicileri örtük bir dönüş getirmeyen diller (örneğin, Pascal, Java veya C #) int için varsayılan (C ve C ++).
Sonunda, klavyenin arkasındaki adam / saat ile bilenmiş bir beceridir. Bazen, burada olduğu gibi (bazı Pascal'esque sözde kodunda) birden fazla dönüş ifadesi olması uygundur:
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
Amaç açıktır ve algoritma yeterince küçük ve tek bir dönüş noktasında kullanılan nihai dönüş değerini tutan bir 'bayrak' değişkeni oluşturulmasını garanti etmeyecek kadar karmaşık değildir. Algoritma hatalı olabilir ancak yapısı, bir hatayı bulma çabasının (büyük olasılıkla) önemsiz olduğu kadar basit.
Bazen değil (burada C benzeri bir sahte kod kullanarak):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
Burada, algoritma basit bir yapıya sahip değildir ve switch ifadesi (bir C tarzı olan), algoritmanın bir parçası olarak kasıtlı olarak yapılabilecek veya yapılmayacak düşme adımlarına izin verir.
Belki de algoritma doğrudur, ancak kötü yazılmış.
Ya da belki, programcının yeteneği ötesinde dış güçler tarafından, bu bir meşru gerekli algoritmanın gerçek (ve doğru) gösterimi.
Belki de yanlış.
Bunların herhangi birinin gerçeğini ortaya çıkarmak için önceki örnekte olduğundan çok daha fazla çaba gerekir . Ve işte şiddetle inandığım bir şey var (bunu destekleyecek resmi bir çalışmam olmadığını unutmayın):
Doğru olduğu kabul edilen bir kod pasajını varsayarak:
Birden fazla return ifadesi, eğer snippet doğal olarak basit bir akış yapısına sahip basit bir algoritmayı temsil ediyorsa, böyle bir kod snippet'inin okunabilirliğini ve basitliğini artırır. Basitçe söylemek gerekirse, kastetmiyorum, ama orantısız bir okuma çabası gerektirmeyen (ya da insanları kusturmaya, birisinin annesini lanetlemeye veya bir mermiyi okumak zorunda kaldıklarında yutmaya teşvik etmeyen), doğal olarak anlaşılabilir ya da öz-kanıt anlamına gelir . )
Tek bir geri dönüş ifadesi, eğer algoritma yürütülürken geri dönüş değeri hesaplanırsa veya algoritmadan hesaplanmasından sorumlu olan algoritmadaki adımlar, algoritmanın yapısı içerisinde bir yerde gruplandırılabilirse, böyle bir kod parçasının okunabilirliğini ve basitliğini arttırır. .
Tek bir return ifadesi, bir veya daha fazla bayrak değişkenine atama gerektiriyorsa, bu tür atamaların konumlarının algoritma boyunca düzgün bir şekilde yerleştirilmemesini gerektiriyorsa, böyle bir kod parçasının okunabilirliğini ve basitliğini azaltır.
Birden fazla geri dönüş ifadesi, geri dönüş ifadeleri algoritma boyunca eşit bir şekilde dağıtılmadığında ve kendi aralarında tek biçimli olmayan karşılıklı özel kod bloklarını ayırırlarsa, böyle bir kod parçasının okunabilirliğini ve basitliğini azaltır.
Bu, söz konusu kod pasajının karmaşıklığı ile yakından ilgilidir. Bu da sırasıyla döngüsel ve halhal karmaşıklığı önlemleriyle ilişkilidir. Bundan, aşağıdakiler gözlemlenebilir:
Bir alt rutinin veya işlevin boyutu ne kadar büyük olursa, iç kontrol akış yapısı da o kadar büyük ve karmaşık olur ve birden fazla veya tek dönüş ifadeleri kullanıp kullanmama sorusuyla karşı karşıya kalma olasılığınız artar.
Bunun sonucu şudur: fonksiyonlarınızı küçük ve tek bir şey yapmakla (ve iyi yapmak). Eğer nominal olarak küçük çevrimsel ve yarı karmaşık karmaşıklık ölçütleri sergilerlerse, sadece en muhtemel doğru olmaları zorunlu değildir ve anlaşılabilir işlerin uygulanması zorunlu değildir, iç yapıları da göreceli olarak açık olacaktır.
O zaman ve sadece o zaman oldukça kolay ve fazla uykusuzluk çekebilirsiniz, herhangi bir seçimde hata yapma riskiyle karşılaşmadan tek bir geri dönüş ve çoklu geri dönüş kullanıp kullanmamaya karar verebilirsiniz.
Bunların hepsine de bakabilir ve insanlar tek iadelerle ya da çoklu iadelerle sorun yaşadıklarında, ya deneyimsizlik, aptallık ya da iş ahlakı eksikliği yüzünden temiz kod yazmadıklarını ve yazma eğiliminde olduklarını söyleyebilirler. tamamen döngüsel ve halstead önlemleri aldırmayan canavarca fonksiyonlar.