İnsanlar neden yöntemlerde # bölge etiketlerine bu kadar şiddetle karşı çıkıyorlar?


27

Yöntemlerin kısa tutulması hakkında çok şey duyuyorum ve bir çok programcının bir yöntemde #region etiketlerini kullanmanın çok uzun olduğunu ve çok sayıda yönteme yeniden yerleştirilmesi gerektiğinin kesin bir işareti olduğunu söylediğini duydum. Bununla birlikte, bana göre, bir yöntemde #region etiketiyle kod ayırmanın birden fazla yönteme yeniden yapılanma konusunda üstün bir çözüm olduğu pek çok durum var.

Hesaplaması oldukça farklı üç aşamaya ayrılabilecek bir yöntemimiz olduğunu varsayalım. Ayrıca, bu aşamaların her biri yalnızca bu yöntemin hesaplanmasıyla ilgilidir ve bu nedenle bunları yeni yöntemlere çıkarmak, bize kod kullanımında hiçbir kazanç sağlamaz. Öyleyse, her aşamayı kendi yöntemine getirmenin faydaları nelerdir? Söyleyebileceğim kadarıyla, kazandığımız tek şey, her bir faz için okunabilirlik ve ayrı bir değişken kapsamdır (bu, belirli bir fazın modifikasyonlarının yanlışlıkla başka bir fazın kırılmasını önlemeye yardımcı olacaktır).

Bununla birlikte, bunların her ikisi de, her bir fazı kendi metodu içine çekmeden elde edilebilir. Bölge etiketleri, kodu aynı şekilde okunabilir bir formda daraltmamıza izin verir (ek olarak, artık bu dosyadaki yerimizi bırakmak zorunda kalmamakla birlikte, kodu genişletip incelemeye karar verirsek) ve {}çalışmak için kendi kapsamını yaratır.

Bu şekilde yapmanın faydası, sınıf düzeyinde kapsamı yalnızca dördüncü bir yöntemin iç işleriyle ilgili olan üç yöntemle kirletmememizdir. Hemen uzun bir yöntemi bir dizi kısa yönteme dönüştürmek, erken optimizasyona eşdeğer kod yeniden kullanımı gibi görünüyor; çoğu zaman ortaya çıkmayan bir sorunu ele almak için ekstra bir karmaşıklık ortaya koyuyorsunuz. Daha sonra kodun yeniden kullanımı için bir fırsat ortaya çıktığında, aşamalardan birini her zaman kendi yöntemine ayıklayabilirsiniz.

Düşünceler?


4
Şu anda oldukça büyük bir sınıfla çalışıyorum. Tek Sorumluluk İlkesini izler; sınıftaki her şey işlevselliği gerektirir. Çoğunlukla yeniden yapılanma nedeniyle birçok özel yöntemi vardır. Bu metodu bizim için çok iyi sonuç veren fonksiyonel kategorilere ayırmak için # bölgesini kullanıyorum. Did bu projede birçok diğer sınıflar vardır değil bu tedaviyi gerektirir. Doğru iş için doğru aracı diyorum.
Robert Harvey,

4
@RobertHarvey, bunları bir sınıfta kullanmak, onları bir yöntem içinde kullanmaktan farklıdır.
CaffGeek

18
@Chad: Ah, bunu farketmedim. Bunları bir yöntemde kullanmak biraz aşırı görünüyor. Bir yöntem # bölgeleri gerektirecek kadar uzunsa, ayrı yöntemlere yeniden uygularım.
Robert Harvey,

8
Gerçekten bir cevap değil, sadece tüm #regionetiketlerden nefret etmiyorum, aynı zamanda Visual Studio'da kod katlamayı tamamen kapatıyorum. Benden saklanmaya çalışan kodu sevmiyorum.
Daniel Pryden

2
"Ayrıca, bu aşamaların her biri yalnızca bu yöntemin hesaplanmasıyla ilgilidir ve bu yüzden onları yeni yöntemlere çıkarmak, bize kodların tekrar kullanılmamasını sağlar". OTOH, eğer bir işlevi 3'e bölersem, çoğu zaman daha sonra bireysel parçaların <i> </i> daha sonra yararlı olduğunu keşfederim, örneğin. eğer bazı girdi verileri sadece bir aşamayı değiştirirse, bunu izolasyon vb. ile test edebilirsiniz.
Jack V.

Yanıtlar:


65

Tek yapmanız gereken tek şey kodunuzun kullanılabilir olması, yeniden kullanılamaz olması. Bir maymun, yapılması gereken herhangi bir dönüşüm varsa, kullanılabilir kodu yeniden kullanılabilir koda dönüştürebilir.

"Sadece burada buna ihtiyacım var" argümanı kibarca söylemek için zayıf. Tarif ettiğiniz teknik genellikle manşet tekniği olarak adlandırılır ve genellikle kaşlarını çatar.

  1. Bölgeleri test edemezsiniz, ancak gerçek yöntemleri izolasyonda test edebilirsiniz.
  2. Bölgeler sözdizimsel öğeler değil yorumlardır. En kötü durumda, bölgelerinizin ve bloklarınızın iç içe geçmesi birbiriyle çelişir. Yapınızın anlamını, kullandığınız dilin sözdizimsel unsurları ile temsil etmek için her zaman çaba göstermelisiniz.
  3. Yöntemlere yeniden baktıktan sonra, metni okumak için artık katlamaya gerek kalmaz. Kaynak koduna bakıldığında, terminal, posta istemcisi, VCS'niz için bir web görünümü veya bir dif-viewer gibi katlama özelliği olmayan herhangi bir araç bulunabilir.
  4. Yöntemlere tekrar aktive edildikten sonra, sonuçta elde edilen yöntem en az bölgeler ile olduğu kadar iyidir, ayrıca tek tek parçaların etrafında hareket ettirilmesi daha kolaydır.
  5. Tek Sorumluluk İlkesi, herhangi bir birimin sadece bir görevi ve bir görevi olması gerektiğini önermektedir. "Ana" yöntemin görevi, istenen sonucu elde etmek için "yardımcı" yöntemleri oluşturmaktır. "Yardımcı" yöntemler, ayrık, basit bir problemi izolasyonda çözer. Tüm bu yöntemleri içeren sınıf aynı zamanda sadece bir görevi yerine getirmeli ve sadece bu göreve ilişkin yöntemleri içermelidir. Bu nedenle yardımcı yöntemler ya sınıf kapsamına girer, ya da kod ilk etapta sınıfta olmamalıdır, ancak en azından bazı genel yöntemlerde veya daha iyisi, enjekte edilmelidir .

Ayrıca alakalı: Jeff Atwoods'un kod katlama hakkındaki düşünceleri


9
1. Çoğu programcı tüm özel yöntemleri test etmez. 2. Bir yöntem adı, o yöntem hakkında bilinmesi gereken her şeyi iletemez; Hangi istisnalar atılabilir? Boş geçerli bir girdi mi? Kodunuzu daha anlaşılır hale getirmek için sözdizimsel olmayan yapıları kullanmak bazen uygundur. Pek çok dilde, dosyalar oldukça yaygın olarak kod düzenleme aracı olarak kabul edilen sözdizimsel olmayan bir öğenin bir örneğidir. 3. Bir yöntemin iç çalışmalarına dalmak en iyi şekilde çeşitli nedenlerle bir IDE'de denenir; bölgelerin VCS'nizde veya posta istemcinizde sizi ısırdığı durumlar oldukça nadirdir.
jojoelson

3
4. Ancak sınıfınızın geri kalanına bazı ciddi karmaşıklıklar aktardınız. Buna değer mi? Ayrıca, bölgeler bir yöntem çağrısı kadar kolay hareket ettirilebilir. 5. Şimdi, sadece tek bir yerde kullanılacak olan daha fazla sınıfla ad alanınızı kirletmekten bahsediyorsunuz. Sınıflar ve yöntemler neden kabul edeceğiniz tek kapsülleme birimleri? Bu yeni sınıfı her zaman daha sonra (veya eğer) ayrı tutmanın gerekli olduğu durumlarda oluşturabilirsiniz.
jojoelson

7
@jjoelson: 1. Peki ne oldu? 2. Tam olarak benim açımdan: eğer tek başına sözdizimi yeterli değilse, sözdizimsel olmayan yapıları kullanmak sorun değil. 3. "Nadir mi?" - Sanırım bunu göstermek için numaraların var. TortoiseSVN ile birlikte gelen diff (veya bu konuda ne olursa olsun) aletinin katlama özelliği olmadığından emin olabilirim. 4. Yaptığım konu ile nasıl ilgisi var? 5. Bu nedenle çoğu modern dil, nesnel isim alanlarına sahiptir. Kodunuzu yapılandırmak için geniş bir kullanılabilir dil öğeleri paleti kullanmak yerine ASCII sanatına başvuruyorsunuz.
back2dos

4
@jjoelson: 1. Bu senin fikrin ve bu sorunun kapsamı dışında. 2. Argümanımı genişleterek yuvalanmış fonksiyonlar bölgelerden daha iyidir, evet. 3. Çünkü bir problemi takip etmek için bazen birkaç revizyona göz atmam gerekiyor. Her iki durumda da, kaynak kodu IDE'ler için değil insanlar için yazılmıştır. 4. Birincisi argüman benim açımdan alakasızdır, ikincisi bu yine sadece sizin fikrinizdir, üçüncü olarak bu sorunun kapsamı dışındadır. 5. C #, iç içe geçme işlevinden başka bir yapılandırma koduna sahiptir. Bunları ya da yuvalama işlevlerine izin veren bir dil kullanmalısınız.
back2dos

13
Siz hala tartışmak istiyorsanız, bunu sohbete almalısınız ... OP'ye söylemeye değecek hiçbir şeyim yok, inançlarına göre belirlenmiş tipik bir genç geliştirici. Hiçbir şey fikrini değiştirmeyecek ancak IMO'yu daha fazla deneyimleyecek.
maple_shaft

15

Sorunlu yöntemlerde bölgeler değil, bölgeleri yöntemlere dahil etmeye ihtiyaç duyulduğunda (hatta bir kullanım) söz konusu olan durum budur.

Pek çok 200-300 çizgi yönteminde hata ayıklamak zorunda kaldım, kimseye istemeyeceğimi söyleyebilirim. Kendi kodunuzu yazıyor ve bakıyorsanız sorun değil - ne istersen yap. Ancak bir başkası baktığında, bir yöntemin ne yaptığı hemen anlaşılmalıdır.

“Önce bir şeyler alır, sonra onları çevreler, o zaman onları şaşırtmaya ihtiyaç duyarlarsa, aksi halde mavi olup olmadıklarını kontrol eder ve Copernicus değerlerini tersine çevirir. Sonra, ikinci şey ilk şeyden daha büyükse, biz meyve suyu kutusunu alıp yerleştirmeliyim ... "

Hayır, bu yeterince iyi değil. İstediğin kadar bölgeye ayır ama yine de düşünerek kafamı sallıyorum.

Metotları kırarsanız birçok fayda elde edersiniz:

  • Nerede olup bittiğine dair daha net bir anlayış, sadece yöntemin adı ile olsa bile. Ve sen yanlış bir yöntem tam olarak belgelenmiş edilemeyeceğini - dokümantasyon bloğu (hit eklemek ///) ve açıklama, parametreleri, dönüş türü girin ve ayrıca exception, example, remarksdetaylara bu senaryoları düğümleri. Gittiği yer bu, işte bunun için!
  • Yan etkisi veya kapsam belirleme problemi yoktur. Tüm değişkenlerinizi bir alt kapsamda ilan ettiğinizi söyleyebilirsiniz {}, ancak aldatmadığınızdan emin olmak için her yöntemi kontrol etmem gerekir mi? Bu, dodgyObjectyalnızca bu bölgede kullanıldığı için mi kullanıyorum, yoksa başka bir yerden mi geldi? Kendi yöntemimde olsaydım, bana geçip geçmediğini veya kendim mi yarattığımı (ya da daha doğrusu sizin yaratıp yaratmadığınızı) kolayca görebilirdim.
  • Olay günlüğüm hangi özel durumun oluştuğunu bana bildirir. Evet, rahatsız edici kodu satır numarasıyla bulabilirim, ancak yöntem adını bilmek (özellikle doğru şekilde adlandırdıysam) bana çok iyi bir gösterge verir. ne oldu ve ne ters gitti. "Ah, TurnThingsUpsideDownyöntem başarısız oldu - muhtemelen kötü bir şeyi çevirirken başarısız oluyor" dan çok daha iyidir. "Ah, DoEverythingyöntem başarısız oldu - 50 farklı şey olabilirdi ve onu bulmak için bir saat boyunca kazmam gerekecek" .

Tüm bunlar, herhangi bir yeniden kullanım veya iyileştirilebilirlik endişesinden öncedir. Düzgün bir şekilde ayrılmış yöntemler, açıkça yeniden kullanımı kolaylaştırır ve aynı zamanda performans göstermeyen bir yöntemi kolayca değiştirmenize olanak sağlar (çok yavaş, çok fazla paraşütlü, bağımlılık değişti vb.). Hiç bu devasa yöntemlerden herhangi birini yeniden düzenlemeyi denediniz mi? Değiştirdiğiniz şeyin başka hiçbir şeyi etkilemeyeceğini bilmenin yolu yok.

Lütfen mantığınızı makul boyutta yöntemlerle doğru şekilde kaplayın. Elden çıkmanın kolay olduğunu biliyorum ve bu noktada bir kez daha yeniden tasarlanmaya değmeyeceğini savunarak başka bir konudur. Ancak , uygun şekilde kapsüllenmiş, temiz yazılmış ve basit bir şekilde tasarlanmış yöntemlere sahip olmanın hiçbir zararı ve en azından potansiyel bir yararı olmadığı gerçeğini kabul etmelisiniz .


Visual Studio'nun XML yorum ayrıştırması, #region etiketleriyle birlikte Visual Studio özellikleri kategorisine girer. Amacım, projenizdeki herkes Visual Studio kullanıyorsa, bu özelliklere güvenmek yanlış değildir. Yan etki ve kapsam belirleme sorunlarına gelince, hala küresel alanlara göre işleri mahvedebilirsiniz. Her iki durumda da, programcıların yan etkileri olan aptalca şeyler yapmamalarına güvenmeniz gerekir.
jojoelson

5
@jjoelson Görsel stüdyosu olmadan XML yorumlarını hala okuyabilirsiniz, ancak bölge etiketleri VS dışında neredeyse tamamen işe yaramaz. Argümanınızın mantıksal uzantısı bölgenize ayrılmış sürece, tüm uygulamanızı çalıştıran dev bir yöntemdir!
Kirk Broadhurst

2
@jjoelson lütfen küresel alanların ne kadar kötü olduğu konusunda bize başlama. Bir şey söylemek işe yaramıyor çünkü zaten onu berbat etmek için bir "geçici çözüm" kullanıyorsun sadece saçma. Sadece yöntemleri kısa tut ve değişkenleri kapsamlandır.
OliverS

@ToplularS, Kirk, paylaşılan devleti bir yöntem alanlarındaki planımla ilgili sorun olarak belirten oldu. Temelde, tam olarak ne diyordu sen diyorsun: Bir programcı bölgeler arasında çok fazla değişken paylaşarak durumunu kötüye olabilir aslında değildir, tüm şemasının bir iddianame, sadece globaller degil' aracılığıyla yöntemleri arasında paylaşılan durumunu berbat yeteneği gibi t Çoklu yöntem şemasının iddiası.
jojoelson

7

Eğer yönteminiz üç ayrı aşamaya ayrılabilecek kadar karmaşıksa, o zaman sadece üç ayrı yöntem olmalı ... ama yönteminiz aslında bu hesaba adanmış ayrı bir sınıf olmalıdır.

“Ama o zaman sınıfımın tek bir ortak metodu olacak!”

Haklısın ve bunda yanlış bir şey yok. Tek sorumluluk ilkesi fikri, sınıfınızın bir şey yapmasıdır .

Sınıfınız sırayla üç yöntemin her birini çağırabilir ve sonucu döndürür. Bir şey.

Bir bonus olarak, artık yönteminiz test edilebilir çünkü artık özel bir yöntem değil.

Ama bir sınıfı boşver ; gerçekte dördü olmalıdır : yönteminizin her bir parçası için bir tane, artı üçünü de bir bağımlılık olarak alan ve onları uygun sırayla çağıran sonucu geri getirmelisiniz.

Bu, sınıflarınızı daha test edilebilir hale getirir . Ayrıca bu üç parçadan birini değiştirmenizi kolaylaştırır. Sadece eskisinden miras kalan yeni bir sınıf yaz ve değiştirilen davranışı geçersiz kıl. Veya üç parçanızın her birinin davranışı için bir arayüz oluşturun; ve sonra bir tanesini değiştirmek için, sadece bu arayüzü uygulayan yeni bir sınıf yazın ve bağımlılık enjeksiyon kabı yapılandırmanızdaki eskisinin yerine koyun.

Ne? Bağımlılık enjeksiyonunu kullanmıyor musunuz? Muhtemelen ihtiyacı henüz görmediniz, çünkü tek bir sorumluluk ilkesini izlemiyorsunuz. Başladıktan sonra, her sınıfa bağımlılıklarını vermenin en kolay yolunun bir DI kabı kullanmak olduğunu göreceksiniz.

EDIT :

Tamam, yeniden düzenleme sorusunu bir kenara bırakalım. Amacı, #regionkodu gizlemektir ; bu, normal koşullarda düzenlenmesi gerekmeyen kod anlamına gelir. Oluşturulan kod en iyi örnektir. Bölgelerde gizlenmelidir çünkü normalde düzenlemenize gerek yoktur. Gerekirse, bir bölgeyi genişletme eylemi size ne yaptığınızı bildiğinizden emin olmak için biraz "Burada ejderha olun" tarzı uyarısı verir.

Bu nedenle söyleyebilirim #regiongerekir değil bir yöntem ortasında kullanılabilir. Bir yöntem açarsam, kodu görmek istiyorum. #Region kullanmak bana ihtiyacım olmayan bir saklanma düzeyi daha verir ve bu bir sıkıntı olur: Yöntemi açıyorum ... ve hala herhangi bir kod göremiyorum.

Yöntemin yapısını gören insanlar için endişeleniyorsanız (ve yeniden düzenlemeyi reddediyorsanız), aşağıdaki gibi afiş yorumları ekleyin:

//
// ---------- COMPUTE SOMETHING OR OTHER ----------
//

Bunlar, kodları tarayan birisinin, #regionetiketlerin genişletilmesi ve daraltılması ile uğraşmak zorunda kalmadan, yönteminizin ayrı bölümlerini görmesine yardımcı olacaktır .


2
Bunların hepsi tek bir yerde çağrılan bir yöntem için mi? Çoğu hardcore Lispers bile, bir işlevi daha kolay tanımlamak için kullanılabilecek en az iki yer tanımlayana kadar daha yüksek bir sıra işlevi göremez.
jojoelson

1
@jjoelson Yeni bir sınıf yapmak çok mu zor? Nedir, bir satır, bir açılış ayracı ve bir kapanış ayracı. Oh, ve basmalısınızctrl+n
Kirk Broadhurst

2
Yeni bir sınıf yapmak zor değil , ancak fazladan bir sınıfa sahip olmak için ek yükler var. Bir kod yöneticisinin aradığı şeyi bulmasını zorlaştıran bir başka dolaylı katmandır. O değil o kadar önemliyse, ama aynı zamanda bu kod biraz başka bir yerde çağrılabilir olası değildir durumda bir şey satın almaz. Bahsettiğiniz gibi, söz konusu yeni bir sınıf oluşturun ve dışarı o dönerse orada kodu koymak oldukça kolaydır yapmak birden fazla yerde bu kod bit aramak gereğini.
jojoelson

2
@jjoelson, bu oldukça yaygın bir tepki. SRP ve DI gibi şeyleri ilk öğrendiğimde benimdi ve bağımlılıkları dağıtmaya başladığımda iş arkadaşlarımın tepkisiydi. Bir davaya bakıyorsan , buna değmez. Avantaj toplamdadır. Tüm sınıflarınızla birlikte SRP yapmaya başladığınızda , uygulamanızın yarısını geçmeden değişiklikler yapmadan kodunuzun bir kısmını değiştirmenin çok daha kolay olduğunu fark edeceksiniz.
Kyralessa

@Kyralessa, bunlar sadece tek bir yerde kullanılan yöntemlerdir. Böyle bir yöntemi değiştirmek, başvurunuzun yarısını geçemez. Bu tür bir kod, onu kullanan yöntemde bir bölge olarak uygulanırsa, mükemmel bir kapsülleme; yalnızca içeren yöntem kodu kullanıyor ve bu nedenle, bu yöntem dışında bunun etkisi hakkında endişelenmeden istediğinizi değiştirmekte özgürsünüz.
jojoelson

4

Bence argümanında verdiğin örnek YAGNI hakkında daha az (buna ihtiyacın olmayacak) ve kolayca idare edilebilecek uygun kalite kodunu yazman hakkında.

En erken programlama derslerinde, eğer bir yöntem 700 LOC uzunluğundaysa, muhtemelen çok büyük olduğunu ve kesinlikle denemek ve hata ayıklamak için dev bir ağrı olacağını öğreniriz.

İkincisi, yalnızca D yönteminde kullanılan A, B ve C yöntemlerini yazarsam, AB ve C'yi D'den bağımsız olarak daha kolay test edebilir ve 4 yöntemde de daha sağlam birim testlerine izin verebilirim.


Ünite testi kesinlikle adil bir nokta ama her durumda sınıf kapsamının kirlenmesini haklı çıkardığından emin değilim. Gerçekçi konuşmak gerekirse, kimse birim yazdıkları her küçük özel yöntemi test ediyor mu? İnsanların çok kullanılan özel metotları test etme eğiliminde olduğunu söyleyebilirim, yani yine de kodların tekrar kullanımı için aday olabilecek özel metotlar.
jojoelson

@jjoelson Metot anlamlı bir mantığa sahipse ve başka bir fonksiyonellik içermiyorsa, her zaman buna karşı bir birim testi yazarım. Birim test yöntemlerinin kod yeniden kullanımı ile ilgisi yoktur. Beklenen çıktılar için tutarlı ve tekrarlanabilir bir şekilde beklenen çıktılar elde ettiğinizi doğrulamak için test yöntemlerini birimine almalısınız. Sınıf kapsamının sizin dediğiniz gibi kirlendiğini fark ediyorsanız , belki de sınıfınız Tek Sorumluluk İlkesini ihlal ediyordur .
maple_shaft

2
Karşılaştığım çoğu programcı, her özel yöntemi test etme fikrine katılmıyor. Özel yöntemlerle ilgili testlerin uygulanması ve sürdürülmesi için harcadığınız süreye değmez.
jojoelson

3

Hesaplaması oldukça farklı üç aşamaya ayrılabilecek bir yöntemimiz olduğunu varsayalım. Ayrıca, bu aşamaların her biri yalnızca bu yöntemin hesaplanmasıyla ilgilidir ve bu nedenle bunları yeni yöntemlere çıkarmak, bize kod kullanımında hiçbir kazanç sağlamaz. Öyleyse, her aşamayı kendi yöntemine getirmenin faydaları nelerdir? Söyleyebileceğim kadarıyla, kazandığımız tek şey her okunabilirlik ve her aşama için ayrı bir değişken kapsamıdır (bu, belirli bir aşamada yapılan değişikliklerin yanlışlıkla başka bir fazın kırılmasını önlemeye yardımcı olacaktır).

Bunlar iki avantaj. Ama önemli olan, benim için zaten, hata ayıklamadır . Bu kodun izini sürmeniz gerekiyorsa, üç bölümden ikisini aşmanız ve yalnızca önemsediğiniz bölümün izini sürmeniz çok daha kolaydır. Yeniden küçük yöntemlere göre yeniden yapılanma bunu sağlar; bölge etiketleri yok.


1
ctrl-f10- imlecine git
Steven Jeuris

2

Benim kişisel kuralım, bir yöntem bir ekrandan daha uzunsa, 40 satır demek, çok uzun. Bir sınıf 500 çizgiden uzunsa, çok büyüktür. Bu kuralları bazen, bazen büyük bir çarpı tarafından bile çiğniyorum, ancak genellikle yıl içinde pişman oluyorum.

20 ila 30 satır olan bir yöntem bile çoğu zaman biraz uzamaktadır. Dolayısıyla bölgeleri bir yöntemde kullanmak genellikle kötü bir fikirdir, çünkü 20 ila 30 satırlık bir bölgeyi birden fazla alt bölgeye daraltmanın hiçbir zaman bir anlamı yoktur.

Bu tanımla uzun süren işlevleri parçalamak en az iki fayda sağlar:

  1. Şu andaki düşüncenizi açıklığa kavuşturan ve daha sonraki bakımcıların görevlerini basitleştiren bu alt işlevlerin ne olduğu hakkında bir isim koyacaksınız.

  2. Küçük fonksiyonlara ayrıştırmak, sizi yalnızca küçük fonksiyonların ihtiyaç duyduğu parametreleri geçmeye zorlar, bu yüzden ihtiyaç duydukları ve değiştirdikleri verilerin kapsamı çok açıktır. Bu, yüzlerce farklı yaprak işlevinde nesne durumuna erişmediğinizi ve değiştirmeyeceğinizi varsayar;

Tecrübelerime göre, bu kurallar ortak hatalar yapmadan yazması daha kolay olan ve daha sonra ince davranışları kırmadan anlaşılabilecek ve değiştirilebilecek bir kod üretir. Kodu anlamak / değiştirmek zorunda olan kişinin başkası mı yoksa her şeyi uyuduktan ve unuttuğumdan sonra kendim olması önemli değil.

Bu yüzden metotlardaki bölgeleri “kodlama kokusu” olarak görür ve sürdürülemez uygulamaların uygulandığını belirtir. Her zaman olduğu gibi, istisnalar olabilir , ancak nadiren tartışmaya değmeyecek kadar nadir görülürler.


2

İşte yine başlıyoruz ... Burada birçok başka konu var aynı tartışmada sonuçlanan programcılar hakkında .

Kısa fonksiyonlarla ilgili bazı ilginç argümanlara dikkat çekiyorsunuz. Bu popüler bir ifade değil, ama bu konuda seninleyim . Bunu daha önce defalarca tartıştıktan sonra, benim görüşüme göre, tartışma genellikle temel olarak enkapsülasyona odaklanıp odaklanmadığınıza veya teste dayalı geliştirme çalışmalarını maksimuma çıkarmanıza bağlı kaldığına dair izlenimimdir. Bunlar, başka bir kutsal savaşa dönüşecek gibi görünen iki ana rakip, ve korkarım ki güçsüz taraftayız.

Ancak ...

Bana göre çözüm kesinlikle bölgelerdeki 'evreleri' sarmıyor. Kod katlama, halının altındaki kodu taramak için kullanılır. Kodu orada olduğu gibi bırakın, size daha sonra yeniden yönlendirmek isteyebileceğinizi hatırlatabilir! Sorunuzdaki bir argümanla ilişkilendirmek için: Herhangi bir kod görmüyorsanız, kodu yeniden kullanma fırsatını nasıl görebileceksiniz? Uzun kod bölümleri tam olarak bu olmalıdır, gözün içindeki bir diken onu yeniden canlandırmak istemedi.

Bölgeler için uygun bir alternatif olarak Alex Papadimoulis'in yorumunda kod paragraflarını kullanmanızı öneririm . Aslında zaten benzer bir yaklaşım kullanıyor olabilirsiniz. Tüm bloğun ne yaptığını açıklayan, sadece yorum başlığı olan kod bloklarıdır. İşlevlerin okunabilirliğine sahipsiniz, ancak normal aralıklarla ingilizce cümleler kullanabilirsiniz ve herhangi bir enkapsülasyonu kaybetmezsiniz.


Temelde kod paragraflarını sınırlandırmak için bölgeleri kullanıyorum (bölgeler kod katlanmış olsa bile görülebilen yorumlara sahip olabilir). Bunun için bölgeleri kullanmayı seviyorum, çünkü bakıcıya, uygulamayı incelemek istiyorsa kodu görme ya da yalnızca "büyük resmi" görmek istiyorsa katlamayı seçme şansı veriyor.
jojoelson

1

Her ne kadar genellikle yeniden kodlayıcıyı kullanmaktan daha iyi olduğunu kabul #regionetmeme rağmen, her zaman mümkün değildir.

Bu ifadeyi desteklemek için, bir örnek vereyim.

class Foo : IComparable
{
  private String name;
  private int foo;
  private Bar bar;

  public int CompareTo(Foo other)
  {
#region Ascending on name
     if (this.name < other.name) return -1;
     if (this.name > other.name) return 1;
#endregion
#region Usual order on bar
     int compBar = bar.compareTo(other.bar);
     if (compBar != 0) return compBar;
#endregion
#region Descending on foo
     if (this.foo > other.foo) return -1;
     if (this.foo < other.foo) return 1;
#endregion
     return 0; // equal
  }

Sırayı değiştirmek için bölgeleri yeniden ayarlamak veya sınıfa ilave alanlar eklendiğinde genişletmek kolaydır. Siparişin nasıl çalıştığını hızlı bir şekilde görmek için yine de yorum yapılması gerekiyor. Ve hepsinden önemlisi: Yeniden yapılanmanın bu durumda okunabilirliğe nasıl yardımcı olacağını bilmiyorum.

Ancak, bu istisnalar nadirdir. Diğer birçok cevabın söylediği gibi, genellikle yeniden ateşlenmek mümkündür.


0

Bazı kişilerin ya da ekiplerin neden kullanmamaya karar verdiğinin tek bir cevabı olduğunu sanmıyorum, #regionancak birkaç tane listelemek zorunda olsaydım, bu en çok neden olduğumun nedeni olurdu.

  • Bölgelerin isimleri ve sıraları, bir çekişme ve bisiklete dönüşme kaynağı olabilen belirli bir stili uygulayan kodun düzenini ve düzenlenmesini daha açık hale getirir.
  • Çoğu kavram temiz bir şekilde az sayıda bölgeye uymuyor. Tipik olarak halka açık , özel, sonra belki üye türüne göre (örneğin, yöntem, özellik, alan) erişim değiştiricileriyle bölgelere başlarsınız, fakat sonra bu değiştiricileri kapsayan inşaatçılar, bunların hepsinin statik çeşitleri, korumalı üyeler, iç üyeler, dahili korumalı üyeler, kapalı arabirim üyeleri, olaylar vb. Sonunda, granüler kategorizasyon nedeniyle her bölgede tek bir yöntem veya yöntemin olduğu en iyi tasarlanmış sınıflara sahip olacaksınız.
  • Eğer pragmatik tutabiliyorsanız ve sadece bir şeyi üç veya dört tutarlı bölge türünde gruplandırabilirseniz, o zaman işe yarayabilir, ancak bu gerçekten ne katma değer sağlar? Sınıfları iyi tasarlıyorsanız, gerçekten kod sayfalarını taramanız gerekmez.
  • Yukarıda belirtildiği gibi bölgeler, olduğundan daha az problemli görünmesine neden olabilecek çirkin kodu gizleyebilir. Bir göz ağrısı olarak tutmak, ele alınmasında yardımcı olabilir.
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.