2013-05-30 1 views
13

우선 : 나는 그것을 시도했지만, 상수 및 기타 관련이없는 정보로 배열을 정의하는 방법에 대한 토론을 주로 발견했습니다.상수만을 포함하는 PHP 클래스

저는 제 코드를 더 읽기 쉽고 (그리고 꽤) 나에게만 들리게하는 해결책에 관해 질문이 있습니다. 기본적으로 대부분의 함수는 성공을 나타내는 상태 코드를 반환하거나, 문제가 발생하면 오류 코드를 반환합니다.

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

목적은 매직 넘버가 내 코드에서 사라지게하고 찾을 필요없이 잘못된 분명히 무엇을하는 것입니다 :이, 나는 단지 정수가 너무 좋아 "상태 코드"라는 클래스를 만들어 어딘가에 explaination :

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

그것은 또한 실수로 중복 오류 코드를 사용할 수있는 가능성을 제거한다. 이 코드는 내 응용 프로그램에 약간의 오버 헤드를 추가하지만 내 코드를 이해하기 쉽도록 만들었습니다. 이 일을하지 않는 이유가 산산조각 날 것입니까? 그것에 대해 갈 수있는 더 좋은 방법일까요?

는 (덜 예쁜 것 때문에 나는 define(CONSTANT, "value") 접근을 방지하고 내 독일어 키보드 :)에 작성하는 번거 로움) 자바와 다른 언어

+7

당신이 한 일을하지 않는 이유는 없습니다. 말했듯이, 그것은 당신의 코드를 더 읽기 쉽게 만듭니다. 오버 헤드 추가에 관해서는 비록 그것이 사실이라면 그것은 최소한의 오버 헤드입니다. 더 나은 방법은 상수를 정의하기 위해 인터페이스를 사용하여 수행 한 작업에 대한 변형이 있습니다. TL, DR - 잘 했어. –

+1

@ N.B와 완전히 일치합니다. 고 밝혔다. 이 게시물의 유일한 문제는 코드 리뷰에서 끝나야한다는 것입니다. 여기를 참조하십시오.) – Prisoner

+1

코딩 스타일의 작은 코너에서 가장 좋은 선택이 있습니다.그리고 스타일에 관해 말할 때, 사람은 "절대 최고"를 말하지 않을 것입니다. ;-) BTW,이 클래스를'abstract' 또는'final' 클래스를 어떻게 사용하지 않을 것인지에 대한 추가적인 힌트로 만들고 싶을 수도 있습니다. 불행히도 그 두 가지가 될 수는 없습니다. – Jon

답변

17

명명 피하기 위해 상수를 이름 공간이 있습니다 일반적으로 사용되는 방법 충돌. here;

나는 그런 클래스를 구현하는 것이 방법은 같습니다이 "

// 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

추상을 사용하는 대신 생성자를 비공개로 만드는 것은 왜 생각하지 않았습니까? 감사합니다. 예제는 "인스턴스화하지 마십시오"와 "확장하지 마십시오"를 모두 다룹니다. – Anpan

1

이 네임 스페이스 지정의 장점과 상수를 그룹화가 있습니다. 당신은 정의 된 상수를 반복하는 클래스에 반사를 사용할 수있는 예를 들어, 값이 특정 상수 그룹의 값임을 검증 할 수 있습니다 (가난한 사람의 상수 유형 힌트 사용 가능).

단점은 클래스를 악용하는 것입니다 정통 주의자들은 그것을 좋아하지 않을 것입니다 .Sam에서 사용되지 않는 상수들 e 클래스는 전역 상수 여야합니다. PHP 5.3+에서 \StatusCodes\SUCCESS과 같은 이름으로 네임 스페이스를 지정할 수도 있습니다.

선택할 수 있습니다. 문제를 해결하면 응용 프로그램이 여러 상태 코드 클래스를 가질 수 있지만, 여전히 상태 코드는 정적이 될 것이라고 생각하는 경우 사용할 수 있습니다 StatusCode

네임 스페이스의 여러 인스턴스를 생성하는 것을 피하기 것 정적 클래스를 생성

+0

라이터로 병 뚜껑을 제거하는 것 같아요. 라이터는 이러한 목적으로 만들어지지 않았지만 잘 작동합니다. 이 연습에 대한 유일한 논쟁은 "하지만 클래스는이 작업을 위해 집어 넣지 않았습니다"하지만 몇 가지 다른 이점이 있습니다. 그러면 괜찮을 것입니다. – Anpan

+0

일종의, 예. :) – deceze

1

.

당신이 싱글 톤 패턴을 사용하려면이 당신 너무

의 선택을 작동합니다!

+0

실제로 나는 어떤 인스턴스도 원하지 않습니다. – Anpan

+0

"class StatusCode"와 같은 클래스 정의에서 메모리 관리가이를 기반으로 할 수 있으므로 여러 인스턴스를 수행 할 수 있으므로 정적 클래스 StatusCode를 더 잘 정의하고 StatusCode :: * –

관련 문제