Kod biçimlendirme: Sınıf dosyasındaki çağrı hiyerarşisine dayalı işlevleri düzenleme?


10

Bob Martin "Temiz kod" dan bir öneri başımı kaşıyor .. "Eğer bir kez fonksiyon başka çağırırsa, onlar dikey olarak yakın olmalı ve arayan callee üstünde olmalıdır"

Şimdiye kadar, sınıf üyelerini türe (özellikler, ctorlar, işlevler) ve görünürlüğe (genel / prot. / Özel) göre gruplayan .Net yönergelerine az çok bağlı kaldım. İpucu ilk başta sorun gibi görünüyor .. ama "sadece işe yarayabilir". Şahsen bu düzeni sevdiğim durumlarla karşılaştım - doğru çağrı zincirindeyken detaylarını incelemek daha kolay.

Bahşiş arkasındaki fikir kulağa hoş geliyor ama "bu sınıfın genel arayüzüne bakayım" gibi diğer senaryolar daha da kötüleşebilir. Belki Bob Amca küçük sınıflar ve görüntüleme türleri için IDE desteği kullanıyor ...

Bunu uzun süre deneyen var mı?

Güncelleme: Kod pasajı hazır gibi görünüyor

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}

2
Korkunç "Bob Amca", kutudaki en keskin kalem değildir.
Neil Butterworth

1
Fikir sadece "bana cesur ayrıntılardan önce büyük resmi ver" dir. Gerektiği gibi uyarlayın.
Ryan Culpepper

2
Eagles tekrar bir araya gelmeye yakın olmalı, çünkü kendimi Neil'in yorumuna katılıyorum. PASCAL ile büyüdüm ve "küçük şeyleri ilk sıraya koydum" çünkü PASCAL referans alınmadan önce tanımlanması gereken tüm şeyleri derler ve İLERİ bildirimler genellikle kaşlarını çattı.
John R. Strohm

@Neil - Kaynak ne olursa olsun tavsiyenin değerini yargılamaya çalışıyorum. @ John - ve ipucu ileri bildirimlerin tersidir .. önce arayanı .. 'callee' arayanların hemen altında ilan edilir.
Gishu

@ryanc - bu paragrafın başlangıcı, "yakından ilişkili / uyumlu" kavramların dikey olarak birbirine yakın olması gerektiğini vurgular [Bir şeyi anlamaya çalışırken kaydırmayı önler]. Çağrılan fonksiyonlar, çağrı sırasına göre arayanın altına yerleştirilir. Eklenen kod parçacığını görün
Gishu

Yanıtlar:


2

Burada bir uzuvda olabilirim, ama kullandığınız aracın bu konuda bir etkisi olup olmadığını merak ediyorum. Geliştiricilerin vermesi gereken IDE kararına karşı metin editörüne atıfta bulunuyorum.

Bir IDE'de, kaynak dosyaları görüntülemek için çok daha fazla işleve sahipsiniz. Genellikle, alfabetik olarak, görünürlüğe göre sıralanan yöntemlerin bir listesini veya kenar çubuğundaki türü bile döndürebilirsiniz. Bunun için bir kullanımınız varsa, bir yönteme de atlayabilirsiniz. Ayrıca yöntemler için çağrı ağaçları oluşturabilir ve ayrıntıya inebilirsiniz. Ayrıca, normal ifadeleri destekleyebilecek güçlü bir find komutunuz da vardır. Bu durumda, oluşturduğunuz yöntemlerin sırası, kullanılabilir kaynak kodu dışında görünümlere sahip olduğunuz için gerçekten önemli değildir.

Bir metin düzenleyicide, genellikle bu özelliklere sahip değilsiniz - sahip olduğunuz en yakın özellik muhtemelen güçlü bir bulma / değiştirme işlemidir. Burada, dosyanızın yapısına daha fazla dikkat etmek isteyeceksiniz, çünkü gezinmek daha zor olabilir. Aradığınızı bulmak için dosyanın etrafında kaydırma süresini en aza indirmek istersiniz ve tutarlı ve mantıklı bir yöntem sırası yardımcı olabilir.


IDE için +1; IDE ne kadar iyi olursa, bu tür şeyler hakkında daha az endişe
duymanız gerekir

1

Mesele şu ki, denilen şeyler bir şeyi çağırmaktan daha az ilginçtir. Bir yöntem diğer yöntemleri ne kadar çok çağırırsa, bu yöntemin nesnenin harici API'sının bir parçası olma olasılığı o kadar yüksektir (bir uygulama ayrıntısının aksine). Bu, dilinizin bu kavramı desteklemesi halinde sınıfın harici API'sı anlamına gelir - doğal olarak dosyanın üstünde "olmasını" isteyecek ve bu yöntemleri bulmayı kolaylaştıracaktır. Tersine, yardımcı fonksiyonlar ve bu gibi şeyler dosyanın altında olmasını isteyecektir.

(Kavramını açıklıyorum, etkinliğini değerlendirmiyorum.)


Evet, ancak tüm ortak işlevler bir grup viz dosyası olarak dosyanın üst kısmına geçmelidir. Konvansiyonel yaklaşım. Önerilen yaklaşım farklı (veya en azından nasıl okuduğum) .. söz konusu güncellemeye bakın
Gishu

Evet, genel işlevleriniz en üste çıkmalıdır. Tabii ki bazı dillerde hiç görünürlük değiştirici yok ...
Frank Shearar

1

Uzun süreye göre birkaç günden fazla demek istiyorsan? Sonra hayır.
Birkaç yıl önce bunu yeni bir kodla yapmaya başladım ve duruncaya kadar kendimi yavaşça delirdim.

Benim kişisel sınıfları dışarı atarken için tercihi

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

Ancak bu dini değil, özellikler ve yöntemler birbirine karışabilir. Görünürlük bu duruma gelmiyor (kamu / korumalı / özel olarak gruplandırmıyorum)

Burada bir adam var, sınıf dosyasındaki her şey üzerinde sıkı bir yapıya sahip, her şey ana gruplar ve alt gruplar halinde, hepsi de bölgelere güzelce yerleştirilmiş. . . İtiraf etmeliyim ki bölgeler Şeytan'ın işi, beni çil kıvrımının etrafında sürüyorlar.

Sınıflarından birini her açtığımda içeride biraz ölürüm :(


Kokuyu maskelemek için eklenen bölgelerle birlikte büyük sınıfları savunmuyorum. Dindar olmaya çalışmak değil ama bir proje içinde tutarlı bir düzene sahip olmak işleri hızlandırır - nereye bakılacağını bilmek. Bu görünürlüğü, belirli bir giriş noktanızı bulabilmeniz ve buradan ayrıntıya
inebilmeniz

Ya inşaatçılar? Bunlar "yöntemler" altında mı?
Cody Gray

@Cody Gray: Özür dilerim, ktorları unuttum!
İkili Worrier

@Gishu: Modern görselleştirme ve gezinme araçlarının katı dosya düzenlerine olan ihtiyacı ortadan kaldırdığını düşünüyorum. Kullanımı ve "Tanıma Git" i sağ tıkladığımda bir yöntemin nerede uygulandığı önemli mi?
İkili Worrier
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.