2010-12-02 18 views
9

Bu, başlangıçta genel olarak görünebilir, ancak aslında, kullanmam gereken kararı vermekteyim. Şu anda üzerinde çalışıyorum neEnum vs Boolean kullanıyor musunuz?

gerekecektir olanlar hangi İstihdam Uygulamaları, bazı noktalarda Aktif veya Aktif Olmayan de işaretlenmesi içerir. Bir başvuru gönderildiğinde, varsayılan olarak Aktif olacaktır. Belirli nedenlerle, daha sonra Inactive olarak ayarlanmış olabilir. Sadece bunlardan biri olabilir ve hiçbir zaman null (Bu durum bir şey değiştirirse) olamaz.

Java + Hazırda Bekletme + PostgresSQL ile kullanıyorum, bu da herhangi bir fark yaratır. Benim ilk içgüdüm benim çözüm olarak Boolean benim çözüm kullanmaktır, bu yüzden bir bayrak gibi davranır, ancak enums veya ints bir bayrak yerine bir durum daha fazla önerdiğini öneren iş arkadaşları var.

Yukarıdaki tüm çözümleri kullanarak bu gibi sorunları çözdüm ve hepsi birbirinden biraz daha şeffaf görünüyor.

Bu durum için daha iyi bir yol var mı?

+1

: [yöntem bağımsız değişken olarak Boolean kabul edilemez musunuz?] Bu durumda, (http://stackoverflow.com/questions/135845/are-booleans-as-method-arguments-unacceptable) –

cevap

5

Tamamen gereksiniminize/belirtiminize bağlıdır. Eğer durumu sadece aktif veya pasif olarak kaydetmek istiyorsanız, en iyi yol boolean'u kullanmaktır.

Ancak gelecekte, sen gibi bir duruma sahip olur

,
  • BLOKE
  • numaralamalar sizin için idealdir ASMA

  • AKTİF

    • AKTİF
    • . Sizin durumunuzda, şimdilik, bir boole yeterlidir. Çok erken bir şeyleri denemeyin, sisteminizin tasarımında & tasarımında odaklanmayı kaybedersiniz.

  • +12

    Bir enum kullanmanın "aşırı derecede karmaşık" olduğunu kabul etmiyorum. Bir enum "aktif" ve "aktif olmayan" ın "gerçek" ve "yanlış" olanlardan daha doğal bir temsilidir ve bu durumlarla ilgili kodların (her biri için bir isim almak da dahil olmak üzere) merkezileştirilmesine izin veren birçok avantajı vardır. Kodun başka yerlerinde dağılmasından ziyade tanımlarıyla. – ColinD

    +3

    @ColinD, önerdiğim şey, temel olarak aktif/aktif değilse, basit bir 'özel boolean aktif' yeterli olacaktır.OP, durumun tam olarak belirlenmesini bilene kadar, bilmediğiniz değer enumları oluşturmanıza gerek yoktur. Ayrıca, PostGres'te bir boole alanını temsil etmek, sisteme ek değer eklendiğinde, tablo alanını her zaman değiştirmekten daha kolaydır. Şimdilik OP, sağlananlarla başlamalıdır. –

    +2

    Birden çok boole alanı kullanmanın avantajı (ör. "Etkin", "askıya alınmış" ve "engellendi"), gelecekte yeni bir durum eklenmesi mevcut kod ve sorguları etkilemez ve bu koşullu ifadeler genellikle daha basit olur. Yani, bir koşul aktif değil (= false), neden aktif olmadığına (askıya alınmış veya bloke edilmiş veya başka bir gelecekteki statüye) sahip olmadığına bakılmasa da ... tabii ki aşağı yönlü daha fazla alan ve sürdürülmesi gereken daha fazla veri - ve Tasarımınız/kodunuzun önlenmesi gereken "active = false" ve "suspended = true" gibi geçersiz/çakışan durum riski. –

    2

    Doğru/yanlış tek olasılıklarsa, boole, enum'dan daha az anlam ifade eder (daha az masraf). Öneri: Boolean ilkelinin yerine Boolean sınıfını kullanın, böylece "bilinmeyen/tanımlanmamış" durumunu yanı sıra doğru/yanlış algılayabilirsiniz.

    +3

    , çünkü durum olamaz 'Boolean', 'Boolean' için tercih edilir, çünkü Boolean, tablodaki NULL sütun değerini eşleyen boş bir değeri kabul eder, ancak bir' boole 'asla boş olamaz. –

    3

    Active ve Inactive dışındaki durumlar için daha fazla duruma ihtiyacınız varsa, enum veya int durum etiketini kullanmak ister misiniz? Bu, kodunuzu gelecekteki durumlar için daha esnek hale getirir.

    11

    Kesinlikle bir int kullanmayın. Bir enum kullanmak geleceğe hazırdır; Kendiniz için daha okunabilir olan ve YAGNI'un geçerli olup olmadığına karar vermelisiniz. boolean'un Boolean ile aynı şey olmadığını unutmayın; Boolean bir sınıf adıdır ve bu nedenle Boolean türünde değişkenler boş olabilir; boolean ise bir ilkeldir.

    1

    Durumunuzda bir boole değeri olması yeterli olmalıdır. Gereklilik 'IsActive' olduğundan ve acil cevap doğru ya da yanlış olabilir. Enum olmak iyi fakat IMO, bir boolean uygunsa

    9

    Gelecekte daha fazla durum türü ekleme olasılığını göz ardı etmese bile (ki bu bir enum için kesinlikle iyi bir argüman), bir enum kesinlikle gitmek için doğru yol olduğunu düşünüyorum. Bir boole koşulunu modellemiyorsunuz, bir uygulamanın durumunu modelliyorsunuz. Bir düşünün: uygulamanın durumu doğru değil veya yanlış, etkin veya aktif değil! enum numaralı bir durum bunu en doğal şekilde temsil edecektir.

    Ayrıca, buna doğrudan bağlı her durumun metin açıklaması sahip olarak, bir enum kullanmasını avantajları inşa çok olsun, böylece

    String text = application.isActive() ? "Active" : "Inactive"; 
    

    gibi şeyler yapmak gerekmez

    Sen sadece Ayrıca

    String text = application.getStatus().toString(); 
    

    yapabilirsiniz, vb her numaralama farklı uygulayan soyut yöntemlerle her durumu, her durumuyla ilişkilendirmek özgü verilere

    doğrudan belirli davranış kravat

    Ayrıca, boolean ürününü depolamanız durumunda, kolayca başka bir şekilde yapamayacağınız bir isActive boole kontrolüne de izin verebilirsiniz.

    public boolean isActive() { 
        return status == Status.ACTIVE; 
    } 
    

    Ve null geçerli bir durum olmamalı aslında alakasız ... sadece herkes ayarlamak çalışırsa durumunu saklamak herhangi sınıfları (diyelim ki, sizin EmploymentApplication sınıf veya her neyse) bir NullPointerException atmak sağlamak Üzerinde bir null durumu.

    +0

    ColinD, bir 'null' durumu Hibernate ve PostgreSQL için kesinlikle geçerlidir. Uygulamanın bir "NullPointerException" atmasına gerçekten gerek yok çünkü veritabanı tablosundaki durum sütunu boş olamazsa, JDBC sürücüsü bir istisna atar. Öznitelik için Hazırda Bekletme eşleştirmesi boş değerlere izin vermiyorsa ve uygulama bu öznitelik için boş bir değere devam etmeye çalışırsa, Hazırda Beklet seçeneği "org.hibernate.PropertyValueException: no-null özellik atıfta null veya geçici bir değer" atar. –

    +0

    @Derek: Tabii ki ... Veritabanından bahsetmedim, ama diyorum ki, 'null' geçerli bir durum değilse, uygulamanın null olması durumunda uygulamanın hızlı bir şekilde başarısız olmasını sağlamanız gerekiyor. Durumu sisteme bir şekilde girer. Ne kadar erken başarısız olursa, null'ın nereden geldiğini ve düzeltildiğini belirlemek o kadar kolay olur ki, o zaman sadece durumun, kodunuzda, _uses_ durumu olan "null" olmadığını varsayın. – ColinD

    +0

    +1, ve kendimi başka bir hesap haline getirmek için çok yakınım, sadece bir daha tekrarlamak için. – whiskeysierra

    1

    Her ikisini birden yapmak mümkün değil mi?

    enum Status { 
        ACTIVATE(true), INACTIVE(false); 
        private final boolean value; 
        Status(boolean value) { 
         this.value = value; 
        } 
        boolean getValue() { 
         return this.value; 
        } 
    } 
    

    Bu, size her iki dünyanın en iyisini almaz mı? True ve false yerine ACTIVE ve INACTIVE adlarıyla bir boole kullanmanıza izin verir?

    +0

    Neden aşağı oy? – ArtOfWarfare

    0

    Boole yerine Enum kullanmanın daha iyi olduğunu düşünüyorum. Etkin java'da, boolelara iki elementli enumları tercih eder. Ayrıca aşağıdaki avantajları da önerdi. Kod Kod Kod API evrim

    için • Çok daha iyi hata küçük olasılık • belgelerine danışmak Az ihtiyacı • (özellikle IDE ile) yazmak daha kolay olduğunu lütfen • okumak daha kolaydır • okumak daha kolaydır Daha fazla bilgi almak için aşağıdaki bağlantıya bakın. İlgili https://www.cs.umd.edu/class/fall2009/cmsc132H/slides/still-effective.pdf

    İlgili konular