2013-05-30 18 views
13

Her şeyden önce, google onu denedim, ancak çoğunlukla sadece sabitler ve diğer ilgisiz bilgiler dizileri tanımlamak hakkında tartışmalar bulundu.PHP Sadece sabitleri içeren sınıflar

Kodumu daha okunaklı (ve güzel) yapmak için bir çözümle ilgili bir sorum var. Temel olarak çoğu fonksiyonun başarılı olduğunu gösteren bir durum kodu döndürmesi veya bir şeylerin yanlış gitmesi durumunda bir hata kodu olması gerekir.

<?php 
class StatusCode { 
    const success = 0; 
    const badArgument = -1; 
    const badQuery = -2; 
    const outOfMana = -3; //Really just for demonstration purposes 
    ... 
} 

amaçlı sihirli numaralar benim kodundan kaybolur ve bir aramaya gerek kalmadan ters gitti açıkça neyi yapmaktır: Bunun için, ben sadece sabitleri içerir şöyle "StatusCode" adlı bir sınıf yapılan yere explaination:

if (mana > 10) { 
    //Do some magic 
    return StatusCode::success; 
} 
else { 
    //Oh god this is not good! 
    return StatusCode::outOfMana; 
} 

Ayrıca kazara yinelenen hata kodları kullanarak olasılığını ortadan kaldırmak gerekir. Oldukça eminim ki bu, başvuruma küçük bir ek yük ekliyor, ancak kodun daha kolay anlaşılmasını sağladı. Bunu yapmamanın bazı yıkıcı sebepleri var mı? Belki bunun için daha iyi bir yol?

(daha az tatlı görünüyor çünkü define(CONSTANT, "value") yaklaşım kaçındım ve benim Alman klavyede :) üzerine yazmak için bir güçlük var) Java ve diğer dillerde

+7

Yaptıklarınızı yapmamanız için bir neden yok. Söylediğiniz gibi, kodunuzu daha okunabilir hale getirir. Havai eklemeye gelince, doğru olsa bile, tamamen minimum yük vardır. Daha iyi yollara gelince, sabitleri tanımlamak için arayüzler kullanarak yaptıklarınızda varyasyonlar vardır. TL; DR - yaptığın şey iyi. –

+1

Tamamen @ N.B'ye katılıyorum. dedim. Bu yazı ile ilgili tek sayım, kod incelemesinde bu noktada olması gerektiğidir;) – Prisoner

+1

Kodlama stilinin bu küçük köşesinde, seçiminiz kesinlikle en iyisidir.Ve stil hakkında konuşurken, çok sık "mutlak en iyi" demek olmaz. ;-) BTW, bu sınıfın "soyut" veya "final" i, nasıl kullanılmaması gerektiğine dair ek bir ipucu yapmak isteyebilirsiniz. Ne yazık ki, anlaşmayı imzalayan ikisi de olamaz. – Jon

cevap

17

adlandırma önlemek için sabitleri ad alanı budur yaygın olarak kullanılan yol çarpışmalar. Bakınız here;

Böyle bir sınıf uygulayacağını yolu gibidir bu"

// make this final so no one can extend it 
final class Errors{ 
    const SUCCESS = 0; 
    const BAD_ARGUMENT = -1; 
    const BAD_QUERY = -2; 
    const OUT_OF_MANA = -3; 

    // make this private so noone can make one 
    private function __construct(){ 
     // throw an exception if someone can get in here (I'm paranoid) 
     throw new Exception("Can't get an instance of Errors"); 
    } 
} 
+1

Neden soyut kullanmak yerine kurucuyu özel yapmayı düşünmedim? Teşekkürler, örneğiniz "anında" ve "uzatmayın" konularını kapsar. – Anpan

1

Bu ad alanı avantaj ve sabitleri gruplama vardır. Sen, tanımlanmış sabitleri tekrarlatacak sınıflarının üzerindeki yansıma kullanabileceğiniz Örneğin, bir değerin belirli bir sabit grubun değeri olduğunu doğrulamanıza olanak tanır (fakir bir adamın sabit tür ipuçlarını etkinleştirmek için)

Dezavantajı, bir sınıfı istismar etmemenizdir. Puristler bundan hoşlanmayabilirler. Sam'de kullanılmayan sabitler. e sınıfı global sabitler olmalı; Hatta bunları PHP 5.3 + 'da \StatusCodes\SUCCESS gibi bir şeye atayabilirsiniz.

Seçim sizin, gerçekten. Sorununuzu çözmek ve size uygulama birden StatusCode sınıfları olabilir ama yine StatusCode statik olacağını düşünürsek kullanılabilir StatusCode

Ad birden çok örneğini oluşturmaktan kaçının edecek bir statik sınıfını oluşturma

+0

Sanırım bir şişe kapağı daha hafif bir şekilde çıkarmak gibi. Çakmak bu amaç için yapılmadı, ama sadece iyi çalışıyor :) Bu uygulamaya karşı tek argüman ise: "Ama bunun için sınıflar iddiasız değildi" ama diğer bazı avantajları var, o zaman sanırım tamam. – Anpan

+0

Sırala, evet. :) – deceze

1

.

singleton deseni kullanmak istiyorsanız bu sizin sitenizde de

Seçim çalışacak!

+0

Aslında hiç bir örnek istemiyorum. – Anpan

+0

Bu "sınıf StatusCode" gibi sınıf tanımından, bellek yönetimi buna dayalı olacak şekilde birden çok örnek yapılabilir, bu yüzden StatCode statik sınıfını daha iyi tanımlayın ve StatusCode :: * olarak kullanın. –