Başlıkta belirtildiği gibi , C # ' da kullanılanlar gibi isteğe bağlı parametreler yararlı mıdır veya uygulama bakımında bir engel midir ve kodun anlaşılmasını zorlaştırabileceklerinden kaçınılmalıdır mı?
Başlıkta belirtildiği gibi , C # ' da kullanılanlar gibi isteğe bağlı parametreler yararlı mıdır veya uygulama bakımında bir engel midir ve kodun anlaşılmasını zorlaştırabileceklerinden kaçınılmalıdır mı?
Yanıtlar:
İsteğe bağlı parametreler, benim tecrübelerime göre, iyi bir şey oldu. Ben her zaman varsayılan değerleri almak ve ne denir biliyorum, çünkü ben onları kafa karıştırıcı (en azından gerçek işlev daha en azından kafa karıştırıcı) buldum.
Onlar için bir kullanım, zaten genel kullanımda olan bir işleve veya en azından genel arayüzde bir işleve başka bir parametre eklemem gerektiğidir. Onlar olmadan, başka bir argüman olan birini çağırmak için orijinal işlevi yeniden yapmak zorunda kalacaktım ve bir kereden fazla argüman eklemeyi bırakırsam bu gerçekten eski olabilir.
new Circle(size, color, filled, ellipseProportions)
nerede size
ve color
gerekli ve geri kalanı varsayılan gibi bir argüman ekleyen aşırı yüklenmiş yöntemlerle değerlidir .
Genel olarak, sık sık birçok / isteğe bağlı parametreye ihtiyacınız varsa, işlevleriniz çok fazla iş yapıyor ve parçalanması gerekiyor. Muhtemelen SRP'yi (Tek Sorumluluk İlkesi) ihlal ediyorsunuz.
Gruplandırılabilen parametreleri arayın, örneğin (x ve y, bir nokta haline gelir).
Bu isteğe bağlı parametre bayrakları varsayılan olarak mı? Bayraklar kullanıyorsanız, işlev bölünmelidir.
Bu, asla isteğe bağlı parametrelere sahip olmamanız gerektiği anlamına gelmez, ancak genel olarak, bir veya iki parametreden fazlası bir kod kokusu önerir.
Fonksiyonun, isteğe bağlı parametrelerin özelliklere ve yapıcı için gerekli parametreler kısmına değiştirilmesiyle, aslında bir sınıf olması gerektiğine dair bir ipucu da olabilir.
İsteğe bağlı parametreler gayet iyi
Genellikle gerekçe şudur: a) yönteminiz için çok sayıda olası argümanınız olduğunu biliyorsunuz, ancak API'nizi kümeleme korkusu nedeniyle aşırı yüklemek istemiyorsunuz veya b) olası tüm argümanları bilmiyorsanız, ancak kullanıcıyı bir dizi sağlamaya zorlamak istemiyorum. Her durumda isteğe bağlı parametreler temiz ve zarif bir şekilde kurtarmaya gelir.
İşte bazı örnekler:
1. Aşırı yüklenmeyi önlemek istiyorsunuz ve bir dizi belirtmek istemiyorsunuz
C, Perl, Java vs.'den printf () ' a bir göz atın . İsteğe bağlı parametrelerin gücüne harika bir örnek.
Örneğin:
printf("I want %d %s %s",1,"chocolate","biccies");
printf("I want %d banana",1);
Aşırı yükleme yok, diziler yok, basit ve sezgisel (standart dize biçimi kodlarını kavradığınızda). Hatta bazı IDE'ler biçim dizenizin isteğe bağlı parametrelerinizle eşleşip eşleşmediğini bile size söyleyecektir.
2. Varsayılanların kullanımına izin vermek ve bunları yöntemin kullanıcısından gizli tutmak istiyorsunuz
SendEmail ( "test@example.org");
SendEmail yöntemi, çeşitli temel değerlerin eksik olduğunu algılar ve tanımlı varsayılanları (konu, gövde, cc, bcc vb.) Kullanarak doldurur. API temiz, ancak esnek tutulur.
Çok fazla parametre hakkında bir not
Ancak, diğerlerinin de belirttiği gibi, bir yönteme ilişkin çok fazla zorunlu parametreye sahip olmak, muhtemelen tasarımınızda bir sorun olduğunu gösterir. Bu, özellikle aynı tür paylaşımda bulunuyorlarsa doğrudur, çünkü çalışma zamanında garip sonuçlara yol açan kazara geliştirici tarafından değiştirilebilirler:
String myMethod(String x, String y, String z, String a, int b, String c, int d) {}
Oluşturmak Parametre Nesnesi yeniden düzenleme için ideal bir aday
String myMethod(ParameterObject po) {}
class ParameterObject {
// Left as public for clarity
public String x;
public String y;
... etc
}
Bu da parametre nesnesi olarak sağlanan bir spesifikasyona sahip bir Fabrika modeline dayanan daha iyi bir tasarıma yol açabilir.
C # varsayılan parametreleri ile sorunlardan biri (Ben voS DoSomething düşünüyorum (int x = 1)) sabitler olmasıdır. Bu, varsayılanı değiştirirseniz, bu yöntem çağrısının tüm tüketicilerini yeniden derlemeniz gerekeceği anlamına gelir. Bunu yapmak yeterince kolay olsa da, bunun tehlikeli olduğu durumlar vardır.
Kodunuzun ne yaptığına bağlıdır. Mantıklı varsayılanlar varsa, isteğe bağlı parametreler kullanmalısınız, ancak anlamlı varsayılanlar yoksa, isteğe bağlı parametreler eklemek kodunuzu daha karmaşık hale getirecektir. Birçok durumda isteğe bağlı parametreler, nil kontrollerini azaltmanın ve dallanma mantığını kesmenin düzgün bir yoludur. Javascript isteğe bağlı parametrelere sahip değildir, ancak onları taklit etmenin bir yolu vardır || (mantıksal veya) ve ben kullanıcı bazı değer vermez, o zaman ben kendi değerlerini || Bu da eğer if ifadelerinin bir demetini yazma zahmetinden kurtarır.
İsteğe bağlı parametreler, basit şeyleri basit ve karmaşık şeyleri aynı anda mümkün kılmak için harika bir yoldur. Çoğu kullanıcının isteyeceği açık bir makul varsayılan varsa, en azından hızlı ve kirli kullanım durumlarında, işlevinizi her aradıklarında manuel olarak belirtmek için kazan plakası yazmaları gerekmez. Öte yandan, insanların bunu değiştirmek istemek için iyi bir nedeni varsa, ortaya çıkması gerekir.
Bir sınıfı kullanmak IMHO korkunç bir çözümdür, çünkü bir sınıfın ne yaptığının tipik zihinsel modeliyle verimsiz, verimsiz ve tutarsızdır. İşlev, bir fiil için mükemmel bir soyutlamadır, yani bir şey yapmak ve geri dönmek. Sınıf, bir isim için doğru soyutlamadır, yani durumu olan ve çeşitli şekillerde manipüle edilebilen bir şey. Birincisi API kullanıcısının zihinsel modeli olmalı, o zaman bir sınıf yapmayın.
İsteğe bağlı argümanlarla ilgili sorun, insanların ilgili kodu yeni bir fonksiyona çıkarmak yerine, işleve gittikçe daha fazla (ve daha fazla) argüman koyma eğiliminde olmasıdır. Bu php aşırı alınır . Örneğin:
bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC
[, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
Başlangıçta python bu özelliği sevdim ve zaten kullanılan yöntemleri 'genişletmek' için kullanılır. Ve güzel ve kolay görünüyordu, ama yakında geri döndü; çünkü isteğe bağlı bir parametre eklediğimde bu, eski istemcinin dayandığı mevcut bir yöntemin davranışını ve mevcut birim sınama durumları tarafından yakalanmayan bir şekilde değiştiriyordu. Temel olarak bunu yapmak Açık Kapalı Prensibi'ni kırmaktır; kodu genişletme için açık ancak değişiklik için kapalı. Bu yüzden mevcut kodu değiştirmek için bu özelliği kullanmak iyi bir fikir olmadığına inanıyorum; ama en baştan kullanılırsa tamam
İsteğe bağlı parametreler kullanmaktan farklı imzalarla (yani parametrelerle) bir işlevi aşırı yüklemenin daha iyi olacağını düşünüyorum.