Alıcıları ve ayarlayıcıları hangi sırayla tanımlar? [kapalı]


14

Alıcıları ve belirleyicileri tanımlamak için en iyi uygulama var mı? İki uygulama var gibi görünüyor:

  • alıcı / ayarlayıcı çiftleri
  • önce alıcılar, sonra pasifler (ya da tam tersi)

Buradaki farkı aydınlatmak için alıcı / ayarlayıcı çiftlerinin Java örneğidir:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Ve işte ilk alıcıların, ardından ayarlayıcıların Java örneği:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

İkinci sipariş türü hem kod hem de sınıf diyagramlarında daha net olduğunu düşünüyorum ama diğer sipariş türü dışlamak için yeterli olup olmadığını bilmiyorum.

Yanıtlar:


8

İlk yol. Mümkünse, her zaman birlikte gruplandırın veya aynı üyelerde çalışan ilgili işlevlerle yakın durun.

Kodunuzu bu şekilde düzenlerseniz, yeniden düzenleme daha net ve daha kolay hale gelir, çünkü bir sınıf çok fazla şey yapan bir sınıftan çarpanlara ayrılabilirse, çarpanlara ayrılabilir parça genellikle belirli bir üye değişken etrafında döner.

Genel olarak, aynı sayfada bir nesnenin / değişkenin tüm yaşam döngüsünü görebildiğinizde, kodda hata ayıklamak, anlamak ve değiştirmek daha kolaydır. Öncelikle kapsam ve alfabetik düzen gibi yüzeyselliklere dayanan Kod düzeninin aslında onları göremediğiniz için refactor fırsatlarını kaçırdığınız anlamına geleceğini söyleyebilirim.


Aynı üyelerde çalışan işlevlerin neden bir arada tutulması gerektiğine dair başka bir argüman eklemek ister misiniz?
NN

Bazı nedenler eklendi.
Benedict

25

Eğer bir takımdaysanız, genellikle yaptıklarını yapın. Aksi takdirde daha çok beğendiğinizi seçin. Önemli tasarım seçenekleri ölçeğinde bu muhtemelen "boşluk çubuğuna basmak için hangi parmağı kullanmalıyım?"


7
Tamamen katılıyorum. Bu herkesin kodlama standart kural olmalıdır "Küçük şeylere takılmayın yok" başlığı altında gelir # 0 (O ise Herb Sutter ve Andre Alexandrescu'nun "Kodlama Standartları C ++" kuralı # 0.)
David Hammen

Eminim insanlar boşluk çubuğuna vurmak için hangi parmağı kullanmaları gerektiğini çok tartıştılar)))
superM

@Michael Ben de sağcıyım. Sadece solumu kullanmayı denedim ama son derece zordu ve yazım taramayı yavaşlattı.
axblount

@axblount Sağ elini kullanıyorum, ama her zaman sol parmağımı kullan. Sadece hakkımı denedim ve tarif ettiğinizle aynı deneyimi yaşadım. Herhangi bir nedenle sol elimle de "y" yazıyorum.
KChaloux

6

Ayrıca dile bağlı olabilir. Java'da her iki sıralamanın da gerçek bir avantajı yoktur, ancak C # 'da, örneğin, alıcıyı ve ayarlayıcıyı birlikte gruplayan "özellikler" kavramına sahipsiniz, bu nedenle bu siparişi zorlar. Görünür değiştirici, her biri için ayrı ayrı yerine birden çok yöntem için bir kez verildiğinden, alıcılar ve ayarlayıcılar (örn. Özel ayarlayıcı, genel alıcı) üzerinde farklı görünürlük isteyebileceğiniz C ++ gibi bir dilde, muhtemelen tam tersini yaparsınız. .


5

Bildiğim kadarıyla, tek bir sözleşme yoktur. Dosya organizasyonu üzerinde Oracle Java Kod Sözleşmeleri bölümü açıkça Alıcı ve ayarlayıcıların yerleşimini söz etmez, ama yazıyor:

Bu yöntemler kapsam veya erişilebilirlik yerine işlevlere göre gruplandırılmalıdır.

Bu herhangi bir rehberlik sağlamaz - her iki yerleşimin de bu ölçütleri karşıladığını iddia edebilirim.

Dikkate alınması gereken bir şey, modern IDE'lerin dosyalarınızın yapısını metinsel kod bileşeninden daha soyut görüntülemeye izin vermesidir. Bu, güçlü arama araçlarıyla birleştiğinde, dosyalarda gezinmeyi ve büyük dosyalar içinde bile uygun yöntemleri bulmayı kolaylaştırmalıdır.

Örneğin, Eclipse yöntemleri ve alanları farklı şekillerde sıralayıp filtrelemenize ve dosyalarda oldukları yere gitmenize izin veren bir Anahat görünümü sağlar. NetBeans benzer bir işleve sahipti ve diğer birçok IDE'nin de yaptığından şüpheleniyorum.

Bunun önemli olabileceği tek zaman kodu IDE'nizin dışında okuyorsanız. Bir örnek, harici bir kod inceleme aracı kullanmak veya sürüm kontrol sisteminizden deltaları görüntülemek olabilir.

En iyi çözüm, bir projedeki dosyalar arasında tutarlı olmaktır. Bir standart bulun, belgeleyin ve ona uyun.


1

Tek bir alan için alıcı ve ayarlayıcıyı çiftler halinde gruplayın.

Tüm alıcıları ve tüm ayarlayıcıları birlikte gruplamak, hangi alanların sadece alıcı veya sadece ayarlayıcı olduğunu söylemek zorlaşır.

Kod okurken veya belirli bir işlevsellik ararken, her alanın bir alıcı ve ayarlayıcıya sahip olduğu bir alanı alanlar olarak görüyorum. Bir sınıfın bir alıcılar grubu ve bir ayarlayıcılar grubu olması her biri alanlara sahip olmak benim için anlamlı değil.


Yani, bir alan için alıcıların o alan için alıcılarla eşleştirilmesi gerektiğinden, sınıftaki belirli alanların nasıl işlendiğini gözden geçirmeyi kolaylaştırır mı?
NN

Bu ve bir sınıfın kavramsal modeli. Sınıflar öncelikle işlevsellik temelinde düzenlenmelidir. Bir sınıf oluştururken, herkesin görebileceği, değiştirilebilir bir alana ihtiyacı olduğuna karar verebilirsiniz. Kavramsal "işlevsellik" budur, alıcı ve ayarlayıcı yöntemlerle sözdizimsel ifade değildir.
M. Dudley

0

Hiç Java IDE sizin için alıcılar ve ayarlayıcılar üretebilir. Sadece bu işlevselliği kullanın ve IDE'nin yarattığı gibi yöntemlerin sırasını bırakın. Bu kod üretilir, gereksiz yere dokunmayın.


Bunun farkındayım. Ancak, örneğin Eclipse'de farklı siparişler arasında seçim yapabilirsiniz .
NN

Sağ. Varsayılan seçenek olan "Alıcı / ayarlayıcı çiftlerindeki alanlar" daha yararlı görünüyor, çünkü daha sonra daha fazla alan ekleyebilir ve hangi yöntemin nereye gittiğinden endişelenmenize gerek kalmadan daha fazla erişimci oluşturabilirsiniz.
user281377
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.