Kaynak yönetimi (bilgi işlem) - Resource management (computing)

İçinde bilgisayar Programlama, kaynak yönetimi yönetme tekniklerini ifade eder kaynaklar (sınırlı kullanılabilirliğe sahip bileşenler).

Bilgisayar programları kendi kaynaklarını yönetebilir[hangi? ] tarafından teşhir edilen özellikleri kullanarak Programlama dilleri (Elder, Jackson ve Liblit (2008) farklı yaklaşımlarla çelişen bir anket makalesidir) veya bunları bir ev sahibi tarafından yönetmeyi seçebilir - bir işletim sistemi veya sanal makine - veya başka bir program.

Ana bilgisayar tabanlı yönetim olarak bilinir kaynak takibi, ve kaynak sızıntılarının temizlenmesinden oluşur: edinilmiş ancak kullanımdan sonra serbest bırakılmamış kaynaklara erişimi sonlandırma. Bu olarak bilinir geri alma kaynaklar ve benzerdir çöp toplama hafıza için. Çoğu sistemde işletim sistemi, işlem, çıkış sistem çağrısı.

Erişimi kontrol etme

Bir program onu ​​kullanmayı bitirdiğinde bir kaynağı serbest bırakmanın ihmal edilmesi, kaynak sızıntısı ve sıralı hesaplamadaki bir sorundur. Sınırlı bir kaynağa erişmek isteyen birden fazla süreç, bir sorun olabilir eşzamanlı hesaplama ve olarak bilinir kaynak çekişmesi.

Kaynak yönetimi, bu iki durumu da önlemek için erişimi kontrol etmeye çalışır.

Kaynak sızıntısı

Resmi olarak, kaynak yönetimi (kaynak sızıntılarının önlenmesi), bir kaynağın ancak ve ancak başarılı bir şekilde elde edilirse serbest bırakılmasını sağlamaktan oluşur. Bu genel problem şu şekilde özetlenebilir: "önce, vücut, ve sonra"normalde bu sırayla çalıştırılan kod, sonra kod, yalnızca ve ancak önce kod başarılı bir şekilde tamamlanır, vücut kod başarıyla yürütülür veya yürütülmez. Bu aynı zamanda etrafında infaz etmek[1] veya a kod sandviçi ve çeşitli başka bağlamlarda ortaya çıkar,[2] program durumunun geçici olarak değiştirilmesi gibi veya izleme giriş ve çıkış altyordam. Bununla birlikte, kaynak yönetimi en çok alıntı yapılan uygulamadır. İçinde bakış açısına yönelik programlama, mantık etrafında böyle bir yürütme, tavsiye.

Terminolojisinde kontrol akışı analizi kaynak sürümünün hakimiyet sonrası başarılı kaynak edinimi;[3] bunun bir hata olduğundan emin olunamaması ve bu koşulu ihlal eden bir kod yolu, kaynak sızıntısına neden olur. Kaynak sızıntıları genellikle küçük sorunlardır, genellikle programı çökertmez, bunun yerine programda veya genel sistemde bir miktar yavaşlamaya neden olur.[2] Ancak, programın kendisi veya diğer programlar nedeniyle çökmelere neden olabilirler. kaynak tükenmesi: sistemin kaynakları tükenirse, edinme istekleri başarısız olur. Bu bir sunabilir güvenlik hatası bir saldırı kaynakların tükenmesine neden olabilirse. Kaynak sızıntıları, normal program akışı altında - örneğin bir kaynağı serbest bırakmayı unutmak gibi - veya programın başka bir bölümünde bir istisna olması durumunda bir kaynağın serbest bırakılmaması gibi istisnai durumlarda meydana gelebilir. Kaynak sızıntılarına çok sık olarak şunlar neden olur: erken çıkış bir alt yordamdan dönüş deyim veya alt yordamın kendisi veya çağırdığı daha derin bir alt yordam tarafından ortaya çıkan bir istisna. İade ifadelerinden kaynaklanan kaynak serbest bırakma işlemi, geri dönüşten önce alt yordam içinde dikkatlice serbest bırakılarak ele alınabilse de, sürüm kodunun çalıştırılmasını garanti eden bazı ek dil olanakları olmadan istisnalar ele alınamaz.

Daha incelikli bir şekilde, başarılı kaynak edinme hakim olmak kaynak yayınlama, aksi takdirde kod edinmediği bir kaynağı serbest bırakmaya çalışacaktır. Böyle yanlış bir sürümün sonuçları sessizce göz ardı edilmekten programı çökertmeye veya öngörülemeyen davranışa kadar uzanır. Bu hatalar, genellikle istisnai bir durum olan ilk başarısızlık için kaynak tahsisi gerektirdiğinden genellikle nadiren ortaya çıkar. Ayrıca, önemli bir kaynağı edinememe nedeniyle program zaten çöktüğü için sonuçlar ciddi olmayabilir. Ancak bunlar, arızanın kurtarılmasını engelleyebilir veya düzenli bir kapatmayı düzensiz bir kapatmaya dönüştürebilir. Bu durum genellikle, ya "başarılı bir şekilde edinilmiş" kayıt için bir boole değişkenine sahip olarak, serbest bırakılmadan önce kaynağın başarılı bir şekilde elde edildiğinin kontrol edilmesiyle sağlanır - bu, kaynak edinilirse atomiklikten yoksundur, ancak bayrak değişkeni güncellenemez veya tersine - veya kaynağın bir boş değer atanabilir tür, burada "boş", atomikliği sağlayan "başarılı bir şekilde elde edilmedi" anlamına gelir.

Kaynak çekişmesi

Hafıza yönetimi

Bellek bir kaynak olarak değerlendirilebilir, ancak hafıza yönetimi Genellikle ayrı olarak değerlendirilir, çünkü bellek ayırma ve serbest bırakma, dosya tanıtıcıları gibi diğer kaynakların edinilmesi ve serbest bırakılmasından önemli ölçüde daha sıktır. Tarafından yönetilen bellek dış sistemin hem (dahili) bellek yönetimi (bellek olduğu için) hem de kaynak yönetimi (harici bir sistem tarafından yönetildiği için) ile benzerlikleri vardır. Örnekler arasında yerel kod aracılığıyla yönetilen ve Java'dan ( Java Yerel Arayüzü ); ve içindeki nesneler Belge Nesnesi Modeli (DOM), kullanılan JavaScript. Her iki durumda da hafıza yöneticisi (Çöp toplayıcı ) of the çalışma zamanı ortamı (sanal makine) harici belleği yönetemez (paylaşılan bellek yönetimi yoktur) ve bu nedenle harici bellek bir kaynak olarak değerlendirilir ve benzer şekilde yönetilir. Bununla birlikte, sistemler arasındaki döngüler (JavaScript'e atıfta bulunan, JavaScript'e atıfta bulunan JavaScript) yönetimi zorlaştırabilir veya imkansız hale getirebilir.

Sözcüksel yönetim ve açık yönetim

Bir programdaki kaynak yönetiminde temel bir ayrım, sözcük yönetimi ve açık yönetim - bir kaynağın, bir yığın değişkeni gibi sözlü bir kapsama sahip olarak ele alınıp alınamayacağı (ömür tek bir sözcük kapsamıyla sınırlıdır, belirli bir kapsama girişte veya belirli bir kapsam dahilinde edinilir ve yürütme bu kapsamdan çıktığında serbest bırakılır) veya bir kaynak, bir işlev içinde edinilen bir kaynak gibi açıkça tahsis edilmeli ve serbest bırakılmalı ve sonra ondan geri döndürülmeli ve daha sonra edinme işlevinin dışında bırakılmalıdır. Sözcüksel yönetim, uygulanabilir olduğunda, endişelerin daha iyi ayrılmasına izin verir ve daha az hataya meyillidir.

Temel teknikler

Kaynak yönetimine temel yaklaşım, bir kaynak elde etmek, onunla bir şeyler yapmak, sonra onu serbest bırakmak ve formun kodunu (Python'da bir dosya açarak gösterilmiştir) vermektir:

f = açık(dosya adı)...f.kapat()

Bu, araya giren ... kod erken bir çıkış içermiyor (dönüş), dilin istisnaları yoktur ve açık başarılı olması garantilidir. Ancak, bir iade veya istisna olması durumunda kaynak sızıntısına neden olur ve aşağıdaki durumlarda alınmayan kaynağın yanlış bir açık başarısız olabilir.

İki temel sorun daha vardır: edinme-bırakma çifti bitişik değildir (yayın kodu edinim kodundan uzağa yazılmalıdır) ve kaynak yönetimi kapsüllenmemiştir - programcı bunların her zaman eşleştirildiğinden manuel olarak emin olmalıdır. Kombinasyon halinde bunlar, edinme ve bırakmanın açıkça eşleştirilmesi gerektiği, ancak bir araya getirilemeyeceği anlamına gelir, böylece bunların doğru şekilde eşleştirilmemesini kolaylaştırır.

Kaynak sızıntısı, aşağıdaki özellikleri destekleyen dillerde çözülebilir: en sonunda yapı (Python gibi) gövdeyi bir Deneyin fıkra ve bir en sonunda fıkra:

f = açık(dosya adı)Deneyin:    ...en sonunda:    f.kapat()

Bu, gövde içinde bir geri dönüş veya atılan bir istisna olsa bile doğru serbest bırakma sağlar. Ayrıca, satın almanın gerçekleştiğine dikkat edin önce Deneyin fıkra, en sonunda fıkra yalnızca açık kod başarılı olur (bir istisna atmadan), "istisna yok" un "başarı" anlamına geldiği varsayılır (durumda olduğu gibi) açık Python'da). Kaynak edinimi, bir istisna atılmadan başarısız olabilirse, örneğin bir boşayrıca, sürümden önce kontrol edilmelidir, örneğin:

f = açık(dosya adı)Deneyin:    ...en sonunda:    Eğer f:        f.kapat()

Bu, doğru kaynak yönetimini sağlarken, bitişiklik veya kapsülleme sağlamada başarısız olur. Birçok dilde kapsülleme sağlayan mekanizmalar vardır, örneğin ile Python'daki ifade:

ile açık(dosya adı) gibi f:    ...

Yukarıdaki teknikler - gevşeme koruması (en sonunda) ve bazı kapsülleme biçimleri - C # 'da çeşitli biçimlerde bulunan kaynak yönetimine yönelik en yaygın yaklaşımdır, Ortak Lisp Java, Python, Ruby, Şema, ve Smalltalk,[1] diğerleri arasında; 1970'lerin sonlarına doğru NIL Lisp lehçesi; görmek İstisna işleme § Geçmiş. Uygulamada birçok varyasyon var ve ayrıca önemli ölçüde farklı yaklaşımlar.

Yaklaşımlar

Gevşeme koruması

Dillerde kaynak yönetimine yönelik en yaygın yaklaşım, yürütme bir kapsamdan çıktığında çağrılan çözme korumasını kullanmaktır - yürütme bloğun sonundan geçerek, bloğun içinden geri dönerek veya fırlatılan bir istisna ile. Bu, yığın yönetimli kaynaklar için çalışır ve C #, Common Lisp, Java, Python, Ruby ve Scheme dahil olmak üzere birçok dilde uygulanır. Bu yaklaşımla ilgili temel problem, sürüm kodunun (en yaygın olarak bir en sonunda cümle) edinme kodundan çok uzak olabilir (eksik bitişiklik) ve edinme ve bırakma kodunun daima arayan tarafından eşleştirilmesi gerektiğini (eksik kapsülleme). Bunlar işlevsel olarak, kapamalar / geri aramalar / coroutines (Common Lisp, Ruby, Scheme) kullanılarak veya hem edinimi hem de bırakmayı yöneten bir nesne kullanarak ve denetim girdiğinde ve çıktığında bu yöntemleri çağırmak için bir dil yapısı ekleyerek düzeltilebilir. bir kapsam (C # kullanma, Java Deneyin-kaynaklarla, Python ile); aşağıya bakınız.

Alternatif, daha zorunlu bir yaklaşım, eşzamansız kod yazmaktır. doğrudan stil: bir kaynak edinin ve sonraki satırda bir ertelenmiş kapsamdan çıkıldığında çağrılan sürüm - eşzamanlı edinim ve ardından eşzamansız yayın. Bu, ScopeGuard sınıfı olarak C ++ 'da ortaya çıktı. Andrei Alexandrescu ve Petru Marginean, 2000,[4] Joshua Lehrer'in geliştirmeleriyle,[5] ve D'de doğrudan dil desteğine sahiptir. dürbün anahtar kelime (ScopeGuardStatement ), bir yaklaşım olduğu istisna güvenliği RAII'ye ek olarak (aşağıya bakın).[6] Ayrıca Go'ya dahil edilmiştir. ertelemek Beyan.[7] Bu yaklaşım, kapsüllemeden yoksundur - biri, edinme ve yayınlama ile açıkça eşleşmelidir - ancak her kaynak için bir nesne oluşturmak zorunda kalmaz (kod açısından, her kaynak türü için bir sınıf yazmaktan kaçının).

Nesne yönelimli programlama

İçinde nesne yönelimli programlama kaynaklar, bunları kullanan nesnelerin içinde kapsüllenir. dosya bir nesneye sahip alan kimin değeri bir dosya tanımlayıcı (veya daha genel dosya tanıtıcısı ). Bu, nesnenin, nesnenin kullanıcıları buna ihtiyaç duymadan kaynağı kullanmasına ve yönetmesine izin verir. Bununla birlikte, nesnelerin ve kaynakların birbirleriyle ilişkilendirilebileceği çok çeşitli yollar vardır.

İlk olarak, mülkiyet sorunu var: bir nesne mi Sahip olmak kaynak?

  • Nesneler olabilir kendi kaynaklar (aracılığıyla nesne bileşimi, güçlü bir "bir" ilişkisi vardır).
  • Nesneler olabilir görünüm kaynaklar (aracılığıyla nesne toplama zayıf bir ilişki "vardır").
  • Nesneler olabilir iletişim kurmak kaynakları olan diğer nesnelerle ( bağlantı ).

Bir kaynağa sahip olan nesneler, onu farklı şekillerde, farklı noktalarda elde edebilir ve serbest bırakabilir. nesne ömrü; bunlar çiftler halinde meydana gelir, ancak pratikte genellikle simetrik olarak kullanılmazlar (aşağıya bakınız):

  • Nesne geçerliyken, aşağıdaki gibi (örnek) yöntemlerle edinme / bırakma açık veya elden çıkarmak.
  • Nesne oluşturma / yok etme sırasında edinme / bırakma (başlatıcı ve sonlandırıcıda).
  • Kaynağı ne elde edin ne de serbest bırakın, bunun yerine basitçe bir görünüm veya referans olduğu gibi, nesneye harici olarak yönetilen bir kaynağa bağımlılık ekleme; somut olarak, bir kaynağı olan (veya sahip olanla iletişim kurabilen) bir nesne, bir yöntem veya kurucuya argüman olarak aktarılır.

En yaygın olanı, nesne oluşturma sırasında bir kaynak elde etmek ve daha sonra bunu, genellikle adı verilen bir örnek yöntemiyle açıkça serbest bırakmaktır. elden çıkarmak. Bu, geleneksel dosya yönetimine benzer ( açık, açık olarak serbest bırak kapat) ve olarak bilinir desen atmak. Bu, birçok büyük modern nesne yönelimli dilde kullanılan temel yaklaşımdır. Java, C # ve Python ve bu dillerin kaynak yönetimini otomatikleştirmek için ek yapıları vardır. Bununla birlikte, bu dillerde bile, daha karmaşık nesne ilişkileri, aşağıda tartışıldığı gibi daha karmaşık kaynak yönetimiyle sonuçlanır.

RAII

Doğal bir yaklaşım, bir kaynağı tutmayı bir sınıf değişmez: kaynaklar, nesne oluşturma (özellikle başlatma) sırasında alınır ve nesne yok etme (özellikle sonlandırma) sırasında serbest bırakılır. Bu olarak bilinir Kaynak Edinimi Başlatmadır (RAII) ve kaynak yönetimini nesne ömrü, canlı nesnelerin gerekli tüm kaynaklara sahip olmasını sağlamak. Diğer yaklaşımlar, kaynak tutmayı bir sınıf değişmez yapmaz ve bu nedenle nesneler gerekli kaynaklara sahip olmayabilir (çünkü bunlar henüz edinilmemiştir, zaten serbest bırakılmıştır veya harici olarak yönetilmektedir), bu da okumaya çalışmak gibi hatalara neden olur. kapalı bir dosyadan. Bu yaklaşım, kaynak yönetimini bellek yönetimine (özellikle nesne yönetimi) bağlar, bu nedenle bellek sızıntısı yoksa (nesne sızıntısı yoksa), kaynak sızıntıları. RAII, yalnızca yığın yönetimli kaynaklar için değil, yığın yönetimli kaynaklar için doğal olarak çalışır ve bir araya getirilebilir: nesneler tarafından rastgele karmaşık ilişkilerde tutulan kaynaklar (karmaşık bir nesne grafiği ) basitçe nesne imhası ile şeffaf bir şekilde serbest bırakılır (bu doğru şekilde yapıldığı sürece!).

RAII, C ++ 'daki standart kaynak yönetimi yaklaşımıdır, ancak cazibesine rağmen C ++ dışında çok az kullanılır, çünkü özellikle modern otomatik bellek yönetimi ile zayıf çalışır çöp toplama izleme: RAII bağlar kaynak yönetiminden bellek yönetimine, ancak bunların önemli farklılıkları var. İlk olarak, kaynaklar pahalı olduğu için, bunların derhal serbest bırakılması arzu edilir, bu nedenle kaynakları tutan nesneler, çöp haline gelir gelmez (artık kullanılmaz) imha edilmelidir. Nesne yok etme, C ++ gibi belirleyici bellek yönetiminde istenir (yığın ayrılan nesneler yığın çözüldüğünde yok edilir, yığın ayrılan nesneler arama yoluyla manuel olarak yok edilir sil veya otomatik olarak kullanarak unique_ptr) veya deterministik referans sayma (nesnelerin referans sayıları 0'a düştüğünde hemen yok edildiği durumlarda) ve bu nedenle RAII bu durumlarda iyi çalışır. Bununla birlikte, çoğu modern otomatik bellek yönetimi deterministik değildir ve nesnelerin derhal veya hiç yok edileceğini garanti etmez! Bunun nedeni, her nesneyi çöp haline gelir gelmez tam olarak toplamaktansa, bir miktar çöp bırakmak daha ucuzdur. İkinci olarak, nesne yok etme sırasında kaynakları serbest bırakmak, bir nesnenin bir nesneye sahip olması gerektiği anlamına gelir. sonlandırıcı (deterministik bellek yönetiminde bir yıkıcı) - nesne basitçe serbest bırakılamaz - bu da çöp toplamayı önemli ölçüde karmaşıklaştırır ve yavaşlatır.

Karmaşık ilişkiler

Birden çok nesne tek bir kaynağa dayandığında, kaynak yönetimi karmaşık olabilir.

Temel soru, "sahip" bir ilişkinin aşağıdakilerden biri olup olmadığıdır: sahip olma başka bir nesne (nesne bileşimi ) veya görüntüleme başka bir nesne (nesne toplama ). Yaygın bir durum, iki nesnenin zincirleme olduğu durumdur. boru ve filtre desen yetki düzeni, dekoratör deseni, ya da adaptör kalıbı. İkinci nesne (doğrudan kullanılmayan) bir kaynak tutuyorsa, kaynağın yönetiminden birinci nesne (doğrudan kullanılan) mı sorumludur? Bu genellikle birinci nesnenin sahibi ikinci nesne: öyleyse, sahip olan nesne de kaynak yönetiminden sorumludur ("bir kaynağa sahip olmak" geçişli ), eğer değilse, o zaman değildir. Ayrıca, tek bir nesne, bazılarına sahip olan ve diğerlerini görüntüleyen birkaç başka nesneye "sahip olabilir".

Her iki durum da yaygın olarak bulunur ve kurallar farklıdır. Kaynakları dolaylı olarak kullanan nesnelere sahip olmak, kaynaktan (kompozisyon) sorumlu olmak kapsülleme (yalnızca, kaynaklar için ayrı nesneler olmadan müşterilerin kullandığı nesneye ihtiyaç duyar), ancak özellikle bir kaynak birden çok nesne tarafından paylaşıldığında veya nesnelerin karmaşık ilişkileri olduğunda önemli ölçüde karmaşıklığa neden olur. Yalnızca kaynağı doğrudan kullanan nesne kaynaktan (toplama) sorumluysa, kaynakları kullanan diğer nesneler arasındaki ilişkiler göz ardı edilebilir, ancak kapsülleme yoktur (doğrudan kullanılan nesnenin ötesinde): kaynak doğrudan yönetilmelidir, ve dolaylı olarak kullanılan nesne için mevcut olmayabilir (ayrı olarak serbest bırakılmışsa).

Uygulama açısından, nesne bileşiminde, elden çıkarma modeli kullanılıyorsa, sahip olan nesne de bir elden çıkarmak yöntem, sırayla elden çıkarmak elden çıkarılması gereken sahip olunan nesnelerin yöntemleri; RAII'de bu otomatik olarak ele alınır (sahip olunan nesnelerin kendileri otomatik olarak yok edildiği sürece: C ++ 'da bir değer veya bir unique_ptr, ancak ham işaretçi değil: bkz. işaretçi sahipliği ). Nesne kümelemede, kaynaktan sorumlu olmadığı için görüntülenen nesne tarafından hiçbir şey yapılmasına gerek yoktur.

Her ikisi de yaygın olarak bulunur. Örneğin, Java Sınıf Kitaplığı, Okuyucu # kapat () alttaki akışı kapatır ve bunlar zincirlenebilir. Örneğin, bir BufferedReader içerebilir InputStreamReadersırayla bir FileInputStreamve arıyor kapat üzerinde BufferedReader sırayla kapatır InputStreamReaderbu da sırayla FileInputStream, bu da sistem dosyası kaynağını serbest bırakır. Aslında, kaynağı doğrudan kullanan nesne, kapsülleme sayesinde anonim bile olabilir:

Deneyin (BufferedReader okuyucu = yeni BufferedReader(yeni InputStreamReader(yeni FileInputStream(dosya adı)))) {    // Okuyucu kullan.}// kaynakla dene bloğundan çıkıldığında okuyucu kapanır, bu da içerilen nesnelerin her birini sırayla kapatır.

Bununla birlikte, yalnızca kaynağı doğrudan kullanan nesneyi yönetmek ve sarıcı nesnelerde kaynak yönetimini kullanmamak da mümkündür:

Deneyin (FileInputStream Akış = yeni FileInputStream(dosya adı)))) {    BufferedReader okuyucu = yeni BufferedReader(yeni InputStreamReader(Akış));    // Okuyucu kullan.}// kaynaklarla dene bloğundan çıkıldığında akış kapatılır.// okuyucu, akış kapatıldıktan sonra artık kullanılamaz, ancak bloktan çıkmadığı sürece bu bir sorun değildir.

Buna karşılık, Python'da bir csv.reader sahibi değil dosya okuyucuyu kapatmaya gerek yoktur (ve mümkün değildir) ve bunun yerine dosya kendisi kapatılmalıdır.[8]

ile açık(dosya adı) gibi f:    r = csv.okuyucu(f)    # R kullanın.# f, with ifadesinden çıkıldığında kapatılır ve artık kullanılamaz.# R'ye hiçbir şey yapılmaz, ancak temeldeki f kapalıdır, bu nedenle r de kullanılamaz.

İçinde .AĞ kural, yalnızca kaynakların doğrudan kullanıcısının sorumlu olmasını sağlamaktır: "IDisposable'ı yalnızca türünüz yönetilmeyen kaynakları doğrudan kullanıyorsa uygulamalısınız."[9]

Daha karmaşık bir durumda nesne grafiği, bir kaynağı paylaşan birden çok nesne veya kaynakları tutan nesneler arasındaki döngüler gibi, uygun kaynak yönetimi oldukça karmaşık olabilir ve nesne sonlandırmadaki (yıkıcılar veya sonlandırıcılar aracılığıyla) tam olarak aynı sorunlar ortaya çıkabilir; örneğin, geçmiş dinleyici sorunu meydana gelebilir ve kaynak sızıntılarına neden olabilir.gözlemci deseni (ve gözlemciler kaynakları elinde tutar). Kaynak yönetiminin daha fazla kontrolüne izin vermek için çeşitli mekanizmalar mevcuttur. Örneğin, Google Kapatma Kitaplığı, goog.Disposable sınıf bir tek kullanımlık bu nesneyle birlikte atılacak diğer nesneleri kaydetme yöntemi, çeşitli alt düzey örnekler ve elden çıkarmayı yönetmek için sınıf yöntemleri.

Yapısal programlama

İçinde yapısal programlama Yığın kaynak yönetimi, kodun tüm durumların üstesinden gelmeye yetecek kadar iç içe geçmesiyle yapılır. Bu, kodun sonunda yalnızca tek bir dönüş gerektirir ve çok sayıda kaynağın edinilmesi gerekiyorsa, büyük ölçüde iç içe kodla sonuçlanabilir; desen karşıtı bazıları tarafından - Ok Karşıtı Desen,[10] arka arkaya yerleştirmeden kaynaklanan üçgen şekli nedeniyle.

Temizleme maddesi

Erken geri dönüşe izin veren ancak temizlemeyi tek bir yerde birleştiren diğer bir yaklaşım, bir işlevin tek bir çıkış dönüşüne sahip olmak, öncesinde temizleme koduna sahip olmak ve kullanmaktır. git Çıkmadan önce temizlemeye atlamak için. Bu, modern kodda nadiren görülür, ancak C'nin bazı kullanımlarında ortaya çıkar.

Ayrıca bakınız

Referanslar

  1. ^ a b Beck 1997, s. 37–39.
  2. ^ a b Elder, Jackson ve Liblit 2008, s. 3.
  3. ^ Elder, Jackson ve Liblit 2008, s. 2.
  4. ^ "Genel: İstisna Korumalı Kod Yazma Şeklinizi Değiştirin - Daima ", tarafından Andrei Alexandrescu ve Petru Marginean, 01 Aralık 2000, Dr. Dobb's
  5. ^ ScopeGuard 2.0, Joshua Lehrer
  6. ^ D: İstisna Güvenlik
  7. ^ Ertele, Panik Yap ve Kurtar Andrew Gerrand, Go Blog, 4 Ağustos 2010
  8. ^ Python: csv.close () yok mu?
  9. ^ "IDisposable Arayüz". Alındı 2016-04-03.
  10. ^ Düzleştirme Ok Kodu, Jeff Atwood, 10 Ocak 2006

daha fazla okuma

Dış bağlantılar