Okunabilirlik yardımı olarak adlandırılan bağımsız değişkenler (parametreler)


11

Uzun zaman önce ADA'da çok şey programladım ve bir işlevi çağırırken argümanları adlandırmak normaldi - SomeObject.DoSomething (SomeParameterName => someValue);

Şimdi C # adlı argümanları desteklediğine göre, bir argümanın ne anlama geldiği belli olmadığı durumlarda bu alışkanlığa geri dönmeyi düşünüyorum.

Bir argümanın ne anlama geldiğinin her zaman açık olması gerektiğini iddia edebilirsiniz, ancak bir boolean argümanınız varsa ve arayanlar "true" veya "false" iletiyorsa, değeri isimle nitelemek çağrı sitesini daha okunabilir hale getirir.

contentFetcher.DownloadNote (not, kılavuz: doğru);

Sanırım doğru veya yanlış kullanmak yerine Enums oluşturabilirim (bu durumda Manuel, Otomatik).

Kodun daha kolay okunmasını sağlamak için zaman zaman adlandırılmış bağımsız değişkenleri kullanma hakkında ne düşünüyorsunuz?


Yöntemlerin üstündeki parametre yorumu da yardımcı olur.
Amir Rezaei

1
@ amir-rezaei: Yöntemlerin üstündeki parametre yorumları yalnızca yorumlara güvenebiliyorsanız yardımcı olur. İyi geliştiriciler ve iyi kod inceleme süreçleri yoksa, yorumlara güvenmem.
btilly

Bir kereye mahsus Ada kullanıcısı olarak tarif ettiğim gibi ara sıra kullanıyorum. Ada, BTW'de kullanıldıklarını bu şekilde hatırlıyorum - buna "anormal" demezdim, ancak "normal" kelimesi, çoğu çağrının parametre adlarını belirleyeceğini ima ediyor gibi görünüyor, bu da şeyleri hatırlamıyorum. Elbette sözleşmeler değişiklik gösterir, ancak gereksiz karmaşa herhangi bir IMO dilinde kötü bir sözleşmedir.
Steve314

Ada'da kullanımınızı kabul ediyorum - bu her zaman yaptığımız bir şey değildi, ama yardımcı olduğu yerde.
Damian

Yanıtlar:


7

Bu C ++ 'ın geliştirilmesinde önerildi ve Stroustrup bunu "C ++ Tasarım ve Gelişimi", sayfa 153 ve sonrasında tartışıyor. Teklif iyi oluşturuldu ve Ada ile daha önce deneyimlendi. Kabul edilmedi.

En büyük neden, hiç kimsenin çok sayıda parametreye sahip işlevleri teşvik etmek istememesiydi. Bir dildeki her ek özellik bir ücrete tabidir ve kötü programlar yazmayı kolaylaştırmak için bir özellik ekleme isteği yoktu.

Ayrıca, kurallı parametre adlarının ne olduğu, özellikle de normal üstbilgi ve kod dosyası kuralında ne olduğu hakkında sorular yöneltti. Bazı kuruluşların .h dosyasında daha uzun ve daha açıklayıcı parametre adları vardı ve .cpp dosyasında adları daha kısa ve daha kolay yazabilirler (isteğe bağlı dosya sonekleri). Bunların aynı olmasını istemek, derleme için ek bir maliyet olacaktır ve kaynak dosyalar arasında adların karıştırılması ince hatalara neden olabilir.

Ayrıca işlev çağrıları yerine nesneler kullanılarak da ele alınabilir. Bir düzine parametreye sahip bir GetWindow çağrısı yerine, bir düzine özel değişkenli bir Window sınıfı oluşturun ve gerekirse ayarlayıcılar ekleyin. Ayarlayıcıları zincirleyerek, benzer bir şey yazmak mümkündür my_window.SetColor(green).SetBorder(true).SetBorderSize(3);. Ayrıca, işi yapan işlevi çağıran farklı varsayılanlara sahip farklı işlevlere sahip olmak da mümkündür.

Eğer dokümantasyonun etkisi hakkında endişeleriniz contentFetcher.DownloadNote(note, manual : true);varsa, her zaman böyle bir şey yazabilirsiniz contentFetcher.DownloadNote(note, /* manual */ true);, bu yüzden dokümantasyonda çok yararlı değildir.


Adadan C'ye taşındığımda tuhaf bir şekilde, tarif ettiğin kuralı kullanmaya başladım - kod eleştirmenleri de nefret ediyordu. Çok sayıda parametre için kullanmamayı kabul edin.
Damian

7

Bence bu, kötü kodu “en iyi uygulama” yerine daha okunaklı hale getirme meselesidir.

20 parametre alan bir yönteme (veya yükleniciye) sahip olmak “kötü bir koku” dur ve muhtemelen tasarımınızdaki bir sorundan kaynaklanıyor olabilir. Ancak yöntemler çok fazla parametre alırken kod üzerinde çalışmak zorunda kalırsam, sonra adlandırılmış parametre kodu daha az anlamak zor hale getirir.

Yöntemlerin yalnızca 1 veya 2 parametresi varsa ve yöntem adından parametrenin ne olduğu açıksa, adlandırılmış parametre hiçbir şey eklemez. Olmak için ideal bir durum bu.

Üzerinde çalıştığınız tüm kodlar “ temiz kod ” kitabı olarak yazıldıysa, adlandırılmış parametreler için çok az kullanımınız olacaktır, ancak gerçek dünyada yaşıyoruz.


1
Her iki parametre de aynı tipteyse ve hangi ipucu yoksa, iki parametreli bir işlev kafa karıştırıcı olabilir. Elbette, işlevi bu ipucunu sağlayacak şekilde adlandırabilirsiniz, ancak gerçekten sadece parametre adlarının ne yaptığını yapıyorsunuz - tek fark bağlamda bile bu ayrıntıyı dahil etmeyi zorunlu kılmak (ör. hangi parametrenin hangisi olduğunu netleştirin.
Steve314

1
@ Steve314 Örnek:void TrackDataChange(Data oldData, Data newData)
Alexander

3

Parametre adını eklemenin onu daha okunabilir hale getirdiğini kabul ediyorum. Ancak, okuduğum kitapların çoğu boole anahtarlarını kötü bir uygulama olarak görüyor. Bazen bunu yaparım:

public Content DownloadNote(Note note)
{
    return downloadNote(note, manual: false);
}

public Content DownloadNoteManually(Note note)
{
    return downloadNote(note, manual: true);
}

Bu, API'nizi uygularken size daha fazla esneklik sağlar. Ayrıca, birden fazla boolean anahtarınızın olduğu durumu kontrol etmenizi sağlar, ancak hepsi aynı anda etkin olamaz.


3
X seçeneğiniz varsa, 2 ^ x ön uç yapacak mısınız?
apoorv020

@ apoorv020 - 2 ^ x anlamlı hale gelen bir yöntem çağrısı için yeterli parametreler varsa, parametre değerlerini tutmak için yeni bir sınıf yapmak ve sadece bir parametre geçmek.
Scott Whitlock

@ scott-whitlock: Seçenek 1 - bir nesne oluşturun, x özelliklerini ayarlayın, bir yöntemi nesnenizle bir kez çağırın. Seçenek 2 - x adlı parametrelerle bir yöntemi çağırın. Hangisi daha iyi dilinize bağlıdır. Dinamik olarak yazılan bir dilde, seçenek 1, kazanç olmadan önemli ölçüde daha fazla kazan plakası gerektirir ve bu nedenle daha kötüdür. Statik olarak yazılan bir dilde ısıtıcı plakayı eklemeye devam edersiniz, ancak yanlış adlandırılmış anahtarların testleri, çalışma zamanı yerine derleme zamanında yapılır. Bu nedenle 1. seçenek C # için daha iyidir, ancak 2. seçenek Python'da açık bir kazançtır.
btilly

@btilly - Ian'ın belirttiği gibi, Clean Code açıkça 2 veya 3 parametreden fazla işleve sahip olmamanızı söyler . Adil olmak gerekirse, statik olarak yazılan Java ile uğraşıyordu. OP ayrıca statik olarak yazılan C # hakkında da soruyor. Uzun bir parametre listesinden daha fazla fonksiyon aşırı yüklemesi ve / veya farklı isimlendirilmiş fonksiyon isimleri kullanmayı tercih ederim.
Scott Whitlock

@ scott-whitlock: Aslında katılmıyor muyuz? C # 'da en iyi olanın ne olduğunu kabul ediyoruz. Temiz Kod'un ne dediğini ikimiz de biliyoruz. Demek istediğim, neyin iyi olduğunu anlamak önemlidir, böylece tavsiyenin ne zaman farklı bir ortama uyduğunu veya uymadığını bilirsiniz.
btilly

3

Türlerin ve anlambilimin yöntemin adından net olmadığı durumlarda adlandırılmış parametrelere inanıyorum. Deneyimlerim, birkaç kişinin belgeleri okuması.

Bununla birlikte, adlandırılmış parametreler, mantıklı argüman listeleri oluşturmaya, yardımcı nesneleri (anlamsal olarak ilgili argümanları "birbirine bağlamak") ve ilgili yerlerde numaralandırma kullanmaya alternatif olmamalıdır.


0

Bu, biraz farklı şekillerde bir şeyler yapmak zorunda olan bir işleve sahip olabileceğiniz OO olmayan dillerde daha yararlı olduğunu düşünüyorum ve ne yapacağını belirleme şekli parametre değerlerine dayanıyor. OOP dünyasında, sadece işlevi aşırı yüklerdik, ancak bu mümkün olmadığında, bir grup bayrağı (veya bir değer grubunu ve bunların geçirilip geçirilmeyeceğini bayraktan geçirerek) geçersiniz.

Bence bir ölçüde daha okunabilir; ama diğerleri de söylediğim gibi, birçok parametre sahip bir kod kokusu, bu yüzden C # gibi bir nesne yönelimli dilde bunun için bir sürü kullanımı görmüyorum.

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.