2008-08-29 19 views
1

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:

  1. 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.

  2. İ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.

  3. Ö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

cevap

1

Ben kuruluk iyi kombinasyonu hissetmek ve sözleşme zorlama (pseudocode) aşağıdaki gibidir ... Bence nadir değildir

Java'da bu kararı destekleyen bir kural vardır: "hiçbir zaman bir kurucudan son olmayan yöntemleri çağırmayın."

0

Yayınınızın ilk bölümünü yanıtlamak için, tesadüfen pencerelere yerleşik olan AzMan'a (Yetkilendirme Yöneticisi) göz atın. Rollere yeniden birleştirilebilen veya doğrudan kullanıcılara atanabilecek işlemleri belirleme özelliğine sahiptir.

Check out

sorunun ikinci kısmını cevaplamak için, ben bir Özet sınıf kullanmak ister. Bunun yerine, yalnızca yapıcıdaki işlevselliği sağlayın ve onunla birlikte yapın. Belirtilen davranışı istiyor ve bunu değiştirmek istemiyorsunuz. Neden inişçileri uygulamayı sağlamak için zorlayın.