Belki de bana yardım etmeme yardımcı olabilecek küçük bir ikilem var.Sınıf tasarım kararı
Bugün ASP.NET'in üyeliğini değiştirerek bir indirme düzeyi eklemek için çalışıyorum. Temel olarak, ASP.NET'in Üyeleri, Kullanıcı ve Rolleri destekler ve tüm yetkilendirme kurallarının bir kullanıcının Rol'e ait olup olmadığına dayalı olmasını sağlar.
Yapmam gereken şey, bir kullanıcının rolüne (veya rollere) ait olduğu İşlev rolünü eklemektir ve rol, bunlarla ilişkili bir veya daha fazla işleve sahip olacaktır. Kullanıcı atanan bir işlevi olan bir role aitse.
Bunu söylediğimde, benim sorunum bununla bir ilgisi yok, genel bir sınıf tasarım sorunu.
Temel RoleProvider sınıfında işlevi oluşturmak için soyut bir yöntem sağlamak istiyorum (ve devam ediyor), ancak bu işlevin açıklamasını isteğe bağlı olarak kaydetmek istiyorum, bu yüzden CreateFunction yöntemimi oluşturmam gerekiyor bir aşırı yük, adı kabul eden bir imza ve adı ve açıklamayı kabul eden diğeri.
aşağıdaki senaryolardan düşünebilirsiniz:
soyut değiştirici ile hem imzaları oluşturun. Bu durum, uygulayıcının, bir aşırı yükün normalleştirilmiş parametrelerle diğerini çağırması gerektiğini söyleyen en iyi uygulamaya uymadığı ve mantığın yalnızca sonuncu (tüm parametrelere sahip olan) olması gerektiği sorununa sahiptir. Ayrıca, geliştirici tarafından her iki yöntemin de uygulanmasını gerektirmek güzel değildir.
İlk benzer sanal ve ikinci benzer soyutları oluşturun. İlkinden ikinciyi çağırın, uygulayıcının davranışı geçersiz kılmasına izin verin. Aynı soruna sahip, uygulayıcı bunu geçersiz kılarken "kötü kararlar" verebilirdi.
Önceden olduğu gibi, ancak ilk olarak geçersiz kılmaya izin vermeyin (sanal değiştiriciyi kaldırın). Buradaki problem, uygulayıcının yöntemin boş bir açıklama ile çağrılabileceğinin farkında olması ve bu durumu ele alması gerektiğidir.
Ben iyi seçenek üçte biri olduğunu düşünüyorum
... bu senaryo genelde işlenir nasıl? Soyut bir sınıf tasarladığınızda ve aşırı yüklenmiş yöntemler içerir. alternatif olarak
class Base {
public final constructor(name) {
constructor(name, null)
end
public abstract constructor(name, description);
}
ya:
class Base {
public abstract constructor(name);
public final constructor(name, description) {
constructor(name)
this.set_description(description)
}
private final set_description(description) {
...
}
}
O