En iyi uygulama: sınıf tanımı içinde genel / korumalı / özel sıralaması?


94

Sıfırdan yeni bir projeye başlıyorum ve temiz olmasını / iyi kodlama standartlarına sahip olmasını istiyorum. Buradaki tecrübeli geliştiriciler, bir sınıftaki işleri hangi sırayla düzenlemeyi sever?

A: 1) genel yöntemler 2) özel yöntemler 3) genel değişkenler 4) özel değişkenler

B: 1) genel değişkenler 2) özel değişkenler 3) genel yöntemler 4) özel yöntemler

C: 1) genel değişkenler 2) genel yöntemler 3) özel yöntemler 4) özel değişkenler

Genel olarak genel statik değişkenleri en üste koymak isterim, ancak daha sonra bir genel statik yöntem kurucunuzun önünde mi listelenir, yoksa kurucu her zaman önce mi listelenir? Bu tür bir şey...

Titiz olduğunu biliyorum ama sadece merak ettim: bunun için en iyi uygulamalar nelerdir?

Not: hayır, Cc # kullanmıyorum. Biliyorum. Ben bir luddite'im.


9
C # kullanmamakta yanlış bir şey yok. Profesyonel bir geliştirici olarak tüm yıllarımda hiç bir C # dikişi yazmadım. Göreve uygun olan dili kullanın ve farklı bir şey söyleyenlere nereye gidebileceklerini söyleyin!
Ether

Yanıtlar:


148

Gelen Temiz Kanunu , Robert C. Martin (daha sonra, ilk sabitler özel üye) sınıfı üstündeki her zaman koymak üye değişkenlerine kodlamacılar öneren ve yöntemler bunlar neden değil bir hikaye gibi okumak böylece şekilde sipariş edilmelidir okuyucunun kodun etrafında çok fazla atlama ihtiyacı duyması. Bu, erişim değiştiriciden ziyade kodu düzenlemenin daha mantıklı bir yoludur.


11
Ayrıca ekleyerek iyi şanslar elde ettim: alıcılar / ayarlayıcılar en son. Bana göre sınıfların daha az hantal hissetmesine yardımcı oluyor.
Dean J

6
Oluşturucular en üstte, üye değişkenlerinden hemen sonra. OOP'de yürütme, nesne somutlaştırması ile başlar.
Asaph

7
Okuyucunun kodun etrafından çok fazla atlamasına neden olmak, muhtemelen okuyucuyu özel yöntemlerin tüm ayrıntılarını okumaya zorlamakla dengelenmelidir. Gazete metaforu muhtemelen, genel yöntemlerin sınıfınızın ne yaptığını genel olarak temsil etmesi gerektiği ve özel yöntemlerinizin ayrıntıları sağlaması gerektiği için yanlış anlaşılmıştır (neredeyse ihtiyacınız olduğunda başvurabileceğiniz bir dipnot gibi).
Kenny Hung

1
Kafam karıştı. Şunu dediniz: (önce sabitler, sonra özel üyeler) . TAMAM. Halk üyeleri nereye gidiyor o zaman?
Honey

1
@Honey Sabitlerin ve özel üyelerin hemen arkasına giderlerdi. Bu, aşağıdaki sırada olacaktır: Sabitler, özel üyeler, genel üyeler.
Pierre Gillet

51

En iyi uygulama tutarlı olmaktır .

Şahsen ben publicönce yöntemleri, ardından protectedyöntemleri, ardından yöntemleri koymayı tercih ederim private. Üye verileri , böyle olmaması için iyi bir nedeniniz olmadıkça, genel olarak her zaman özel veya korumalı olmalıdır.

publicYöntemleri en üste koymak için mantığım, sınıfınız için arayüzü tanımlamasıdır , bu nedenle başlık dosyanızı inceleyen herkes bu bilgiyi hemen görebilmelidir.

Genel olarak, privateve protectedüyeleri, sınıfın iç elemanların değiştirilmesi dikkate sürece, başlık dosyasına bakan çoğu insan için daha az önemlidir. Bunları "yolun dışında" tutmak, bu bilginin, kapsüllemenin daha önemli yönlerinden biri olan yalnızca bilinmesi gereken bir temelde muhafaza edilmesini sağlar.


LeopardSkikPBH, tamamen katılıyorum ... bu mantıklı! Sanırım bunun içinde var veya funcs'un öncelikli olup olmadığı konusunda kafam karıştı. Teşekkürler!
tempname

12
En iyi uygulamanın tutarlı olmak olduğuna katılmıyorum. Sürekli olarak okunamayan, bakılamayan kodlar yazmanın birçok yolu vardır.
jason

3
@ Jason, yolun kendi tarafında kalmanın en iyi uygulama olmadığını söylemek gibi bir şey çünkü orada hala kazalar yaşayabilirsiniz.
Rex M

1
@Jason - Belki daha net olmalıydım. Bu özel, oldukça öznel durumda (yöntemlerin sıralanması) en iyi uygulamanın tutarlı olması gerektiğini düşünüyorum. Herkesin bir şeyleri sipariş etmenin en iyi yolu hakkında fikirleri olacak, ancak doğası gereği tutarlıysanız, oldukça sürdürülebilir olmalıdır. "Tutarlı olmanın" her zaman kodun tüm alanları için en iyi uygulama olmadığını kabul ediyorum, özellikle sık sık uğraşmak zorunda olduğunuz düşük kod kalitesini düşündüğünüzde.
LeopardSkinPillBoxHat

4
@Rex M: Hayır, söylediklerim yorumunuza hiç benzemiyor. Demek istediğim, yalnızca tutarlı olmanın bu durumda güçlü bir argüman olmadığıdır. Bazı durumlarda tutarlılık iyidir (örneğin, diş tellerinin yerleştirilmesi). Ancak buradaki seçimler aslında kodun okunabilirliğini etkiler. Bu nedenle tutarlılıktan daha güçlü bir argümana ihtiyaç vardır.
jason

9

Bu konuda çoğundan farklı bir felsefem olduğunu düşünüyorum. İlgili öğeleri birlikte gruplamayı tercih ederim. Bir sınıfla çalışmak için zıplayıp durmaya dayanamıyorum. Kod akmalı ve erişilebilirliğe (genel, özel, korumalı vb.) Dayalı oldukça yapay bir sıralama veya statik veya üyeye karşı özelliğe karşı işlev, güzel bir akış sağlamaya yardımcı olmaz. Ben genel bir yöntem kafa yapıcı Yani Methodözel yardımcı yöntemlerle uygulanmaktadır HelperMethodA, HelperMethodBvb sonra yerine birbirinden uzak dosyada birbirinden bu yöntemi var, birbirine yakın onları koruyacaktır. Benzer şekilde, statik bir yöntemle uygulanan bir örnek yöntemim varsa, bunları da gruplayacağım.

Yani derslerim genellikle şöyle görünür:

class MyClass {
    public string Method(int a) {
        return HelperMethodA(a) + HelperMethodB(this.SomeStringMember);
    }

    string HelperMethodA(int a) { // returns some string }

    string HelperMethodB(string s) { // returns some string }

    public bool Equals(MyClass other) { return MyClass.Equals(this, other); }

    public static bool Equals(MyClass left, MyClass right) { // return some bool }

    public double SomeCalculation(double x, double y) {
        if(x < 0) throw new ArgumentOutOfRangeException("x");
        return DoSomeCalculation(x, y); 
    }

    const double aConstant;
    const double anotherConstant;
    double DoSomeCalculation(double x, double y) {
        return Math.Pow(aConstant, x) * Math.Sin(y) 
            + this.SomeDoubleMember * anotherConstant;
    }       
}

9

Şahsen ben kamuya açık, korumalı ve sonra özel olmayı seviyorum. Bunun nedeni, birisi başlığı kırdığında, önce neye erişebileceğini, ardından aşağı kaydırdıkça daha fazla ayrıntıyı görmesidir.

Kullanmak için bir sınıfın uygulama detaylarına bakmak zorunda değilsiniz, o zaman sınıf tasarımı iyi yapılmaz.


3

Çok önemsiyordum. Son birkaç yıldır modern IDE'leri kullanarak hemen hemen her şey sadece 1 veya 2 tuş vuruşu uzaklıkta, standartlarımın büyük ölçüde gevşemesine izin verdim. Şimdi, statikler, üye değişkenler, sonra kurucularla başlıyorum, bundan sonra pek endişelenmiyorum.

C # 'da Resharper'ın işleri otomatik olarak düzenlemesine izin veriyorum.


Katılıyorum. Bir dosyadaki üyeler arasında normal gezinme tarzım, kullandığım IDE veya düzenleyicide yerleşik bir araç kullanmaktır. Üyelerin gerçek gruplaması ikincil hale gelir. Ancak, tamamen rastgele sıralamayı önlemek için üyelerin gruplandırılması gerektiğini kabul ediyorum ve gruplama ve sıralamayı otomatik olarak yeniden paylaşan kullanıyorum.
Phillip Ngan

2

Bu benim siparişim olurdu

  1. Statik Değişkenler
  2. Statik Yöntemler
  3. Genel Değişkenler
  4. Korumalı Değişkenler
  5. Özel Değişkenler
  6. İnşaatçılar
  7. Kamu Yöntemleri
  8. Korumalı Yöntemler
  9. Özel Yöntemler

Aşağıdaki kuralları kullanıyorum:

  • her şeyden önce statik
  • değişkenler, yöntemlerden önce oluşturuculardan önce (yapıcıların yöntemler kategorisinde olduğunu düşünüyorum)
  • özelden önce korunmadan önce kamu

Buradaki fikir, davranışlardan (yöntemlerden) önce nesneyi (verileri) tanımlamanızdır. Statiklerin ayrılması gerekir çünkü bunlar gerçekte nesnenin bir parçası veya davranışı değildir.


teşekkürler barkmadley ... bu ilginç! yapıcıdan önce 4 ve 5 koyacağınızı. Bunu kesinlikle düşüneceğim
tempname

Bu sıra gibi üste yakın statik metotların olması ilginçtir. En alta özel değişkenler koyan bir geliştiriciyle çalıştım, fikri görebiliyordum ama doğru gelmedi
Carlton

2

Genel olarak kamuya açık, korumalı, özel düzen ile statik veriler, üye verileri, üye işlevleri düzenine katılıyorum.

Bazen üyeler gibi gruplandırsam da (alıcılar ve ayarlayıcılar) genellikle daha kolay bulunabilmeleri için üyeleri ALFABETİK OLARAK bir grup içinde listelemeyi tercih ederim.

Ayrıca verileri / işlevleri dikey olarak sıralamayı da seviyorum. Tüm adların aynı sütunda hizalanması için yeterince sağa sekme / boşluk bırakıyorum.


1
Hey - kendi kalbimden sonra bir 'sekme ayırıcı'! :-) Obsesif kompulsif değilim. Dürüst değilim!
tempname

1

Her biri için kendi başına ve Elzo'nun dediği gibi, modern IDE'ler, açılır menülerdeki renkli simgeler ve benzerleriyle üyeleri ve değiştiricilerini kolay bir şekilde bulmayı kolaylaştırdı.

Benim fikrim, programcının sınıfın ne için tasarlandığını ve nasıl davranmasının beklenebileceğini bilmesinin daha önemli olduğudur.

Yani, eğer bir Singleton ise, ilk önce anlambilim (statik getInstance () sınıfı) koyuyorum.

Somut bir fabrika ise getNew () fonksiyonunu ve register / initialize fonksiyonlarını önce koyarım.

... ve bunun gibi. İlk dediğimde, c'tors ve d'tor'dan hemen sonra demek istiyorum - çünkü bunlar herhangi bir sınıfı başlatmanın varsayılan yoludur.

Ardından aşağıdaki işlevler şunlardır:

  1. mantıksal çağrı sırası (ör. initialize (), preProcess (), process (), postProcess ()) veya
  2. ilgili işlevler birlikte (erişimciler, yardımcı programlar, manipülatörler vb.),

sınıfın öncelikle bazı işlevlere sahip bir veri deposu mu yoksa birkaç veri üyeli işlev sağlayıcısı mı olduğuna bağlı olarak.


0

Eclipse ve yavruları gibi bazı düzenleyiciler, ana hat görünümünde değişkenleri ve yöntemleri alfabetik olarak veya sayfadaki gibi yeniden sıralamanıza izin verir.


0

Korumalı ve özelin izlediği public dizisi benim için daha okunabilir. Başlık dosyasının üst kısmındaki yorumlarda sınıf mantığını basitçe tanımlamak ve içinde hangi sınıf dozu ve algoritmaların kullanıldığını anlamak için işlev çağrısı sıralarını tanımlamak daha iyidir.

Bir süredir Qt c ++ kullanıyorum ve bazı yeni anahtar kelimeler görüyorum signalve slotyukarıdaki gibi sıralamayı sürdürmeyi ve fikrimi burada sizinle paylaşmayı tercih ediyorum.

#ifndef TEMPLATE_H
#define TEMPLATE_H


class ClassName
{
    Q_OBJECT
    Q_PROPERTY(qreal startValue READ startValue WRITE setStartValue)
    Q_ENUMS(MyEnum)

public:

    enum MyEnum {
        Hello = 0x0,
        World = 0x1
    };

    // constructors

    explicit ClassName(QObject *parent = Q_NULLPTR);
    ~ClassName();

    // getter and setters of member variables

    // public functions (normal & virtual) -> orderby logic

public slots:

signals:

protected:

    // protected functions it's rule followed like public functions


private slots:

private:

    // methods

    // members

};

#endif // TEMPLATE_H
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.