Bu Tekli Giriş, Tekli Çıkış (SESE) kavramı, C ve montaj gibi açık kaynak yönetimi olan dillerden gelir . C kodunda bunun gibi kodlar sızıntı yapacak:
void f()
{
resource res = acquire_resource(); // think malloc()
if( f1(res) )
return; // leaks res
f2(res);
release_resource(res); // think free()
}
Bu tür dillerde, temel olarak üç seçeneğiniz vardır:
Temizleme kodunu çoğaltın.
Ugh. Artıklık her zaman kötüdür.
goto
Temizleme koduna atlamak için a kullanın .
Bu, temizleme kodunun işlevdeki son şey olmasını gerektirir. (Ve bu yüzden bazıları goto
onun yerini aldığını iddia ediyor . Ve gerçekten de - C.'de)
Yerel bir değişken tanıtın ve bunun içinden kontrol akışını değiştirin.
Dezavantajı (düşünmek sözdizimi aracılığıyla manipüle o kontrol akışı break
, return
, if
, while
değişkenlerin devlet aracılığıyla manipüle kontrol akışı (eğer algoritma baktığınızda bu değişkenlerin hiçbir devlet var çünkü) daha takip etmek çok daha kolaydır).
Montajda daha da tuhaf, çünkü o fonksiyonu çağırdığınızda bir fonksiyondaki herhangi bir adrese atlayabilirsiniz, bu da herhangi bir fonksiyon için neredeyse sınırsız sayıda giriş noktasına sahip olduğunuz anlamına gelir. (Bazen bu yararlıdır. Bu tür parçalar , C ++ 'da çoklu kalıtım senaryolarında işlevleri this
çağırmak için gerekli olan işaretçi ayarını uygulamak için derleyiciler için yaygın bir tekniktir virtual
.)
Kaynakları manuel olarak yönetmeniz gerektiğinde, herhangi bir yere bir işleve girme veya çıkma seçeneklerinden yararlanmak, daha karmaşık kodlara ve dolayısıyla hatalara yol açar. Bu nedenle, daha temiz kodlar ve daha az hata elde etmek için SESE'yi geliştiren bir düşünce okulu ortaya çıktı.
Bununla birlikte, bir dil istisnalar içerdiğinde, (neredeyse) herhangi bir işlev herhangi bir noktada (neredeyse) herhangi bir noktada erken çıkar, bu nedenle erken dönüş için gerekli hükümleri yapmanız gerekir. (Sanırım finally
başta Java bunun için kullanılır ve using
uygularken ( IDisposable
, finally
aksi) C # C ++ yerine istihdam RAII .) Bunu yaptıktan sonra, olamaz nedeniyle erken üzere kendinize temizlemek için başarısız return
açıklamada, peki muhtemelen SESE lehine en güçlü argüman ortadan kayboldu.
Bu okunabilirliği bırakır. Tabii ki, return
üzerine rastgele serpilen yarım düzine ifadeli 200 LoC işlevi iyi bir programlama stili değildir ve okunabilir kodlar yapmaz. Ancak böyle bir işlev, bu erken dönüşler olmadan da anlaşılması kolay olmaz.
Kaynakların manuel olarak yönetilemediği veya yönetilmemesi gereken dillerde, eski SESE sözleşmesine bağlı kalmanın değeri yoktur veya çok azdır. OTOH, yukarıda belirttiğim gibi, SESE sıklıkla kodu daha karmaşık hale getirir . (C hariç) günümüz dillerinin çoğuna tam olarak uymayan bir dinozor. Kodun anlaşılabilirliğine yardım etmek yerine, onu engeller.
Java programcıları neden buna bağlı? Bilmiyorum ama (dışardan) POV’mdan Java, C’den (mantıklı oldukları yer) birçok konvansiyon aldı ve onları OO dünyasına uyguladı (nerede işe yaramazlar ya da tamamen kötüler) Onları, ne pahasına olursa olsun. (Tüm değişkenlerinizi kapsamın başlangıcında tanımlama sözleşmesi gibi)
Programcılar irrasyonel sebeplerle her türlü garip gösterime sadık kalırlar. (Derinden iç içe geçmiş yapısal ifadeler - "ok uçları" - Pascal gibi dillerde bir zamanlar güzel kodlar olarak görüldü.) Buna mantıklı bir mantıksal akıl yürütmek, çoğunluğunu yerleşik yollarından sapmaya ikna etmekte başarısız görünüyor. Bu tür alışkanlıkları değiştirmenin en iyi yolu muhtemelen geleneksel olanı değil, en iyisini yapmayı öğretmektir. Siz, bir programlama öğretmeni olarak, elinizde tutun.:)