2013-12-13 3 views
1

__construct에 직접 속성을 설정하는 것은 바람직하지 않습니다. Object Oriented PHP에서 이러한 코드 블록 중 하나가 더 나은 방법입니까? 나는 클래스의 외부에서 작업을 수행하는 나쁜 관행을 알고__construct에서 직접 속성을 설정하는 것은 나쁜 습관입니까?

...

class person { 
    protected $name; 

    function __construct($persons_name) { 
     $this->set_name($persons_name); 
    } 
    function set_name($new_name){ 
     $this->name = $new_name; 
    } 
} 

VS.

class person { 
    protected $name; 

    function __construct($persons_name) { 
     $this->name = $persons_name; 
    } 
    function set_name($new_name){ 
     $this->name = $new_name; 
    } 
} 
+0

나는'__set()'을 사용해야하므로'set_name()'이 나쁜 습관이라고 주장한다. 다른 사람들은 게타와 세터가 모두 나쁜 습관이라고 주장한다. 골라보세요. –

+0

PHP OOP를 올바른 방법으로 배울 수있는 좋은 책이 있습니까? 귀하의 재산이 공개되어 있기 때문에 –

+2

'set_name()'은 여기에 중복됩니다. 왜 누군가가 그것을 변경하는 방법을 사용해야합니까? 그것을 보호하거나 개인으로 만드는 것만으로도이 방법을 사용하는 이유가있을 수 있습니다.setter는 직접 액세스 할 수없는 좋은 이유가있는 속성에 적합합니다. –

답변

1

두 문장 모두 기본적으로 정상입니다. 참고해야 할 작은 차이가 있습니다.

  • set_name() 메서드는 무시 가능합니다. 즉, 메서드를 확장하는 함수로 인해 메서드의 동작이 변경 될 수 있습니다. 이것은 또한 좋지도 나쁘지도 않습니다. 당신이 당신의 응용 프로그램이 그것을 기대하든하지 않을 것인지를 생각해야합니다.

  • hek2mgl에서 설명한 것처럼 추가 작업을 수행하여 생성자가 생성 한 데이터의 유효성을 검사하고 중복 코드를 방지 할 수도 있습니다.

  • 두 번째는 성능입니다. 성능 우선 순위 (항상 깨끗하고 읽기 쉬운 코드)로 코드 작성하지 않아도되지만, 메소드를 사용하면 서버가 다른 곳에서 유용 할 수있는 몇 가지 CPU 사이클을 소비하게됩니다.

응용 프로그램이 set_name() 메소드를 사용하고 '재정의에 안전'하도록하려면 최종 키워드를 사용할 수 있습니다.

0

이 예에서는 차이가 없지만 두 번째 것은 "더 좋음"입니다. 이는 일반적으로 setter 메소드에 몇 가지 유효성 검사 또는 이와 유사한 것을 포함시키기 때문입니다. 따라서 속성을 직접 설정할 때 매개 변수를 무시하면됩니다.

OOP 디자인에 대해 생각하는 또 다른 중요한 점은, 당신은 세터를 호출하는 경우, 당신은

+0

그러면 비즈니스 논리가 모델에 포함될 수 있습니다. 대부분의 경우 setter는 설정 도구 일뿐입니다. – Jessica

+0

@ hek2mgl'$ persons_name'이'__construct'에 의해 설정 될 때 setter와 똑같이 유효성을 검사 할 수 있기 때문에 첫 번째 것이 더 낫다는 것을 의미합니까? –

+0

예, 유효성 검사가 있거나 세터에서 실행되도록 계획 한 유형 검사가있는 경우이를 우회하는 이유는 무엇입니까? setters 정말 더 이상 확인하지 않고 값을 설정하는 경우 다음 공공 재산을 사용할 수 있습니다 – hek2mgl

1

그것은 '외설 전체 생성자를 오버라이드 (override) 할 필요없이 해당 프로세스를 변경하는 서브 클래스에게 가능성을 제공한다는 사실이다 나쁜 습관으로 여겨졌다. 실제로는 set_name($name)이 실제로 무엇을하는지에 달려 있습니다.

변수의 값을 질문에서와 같이 직접 설정하는 경우 추가 함수 호출의 성능 비용이 있습니다. 그러나 이것은 매우 작습니다.

그러나 설정하기 전에 인수를 편집/수정하는 경우 코드 중복을 방지하기 위해 함수 내에 캡슐화 된 기능을 유지하는 것이 가장 좋습니다.

+1

OP의 질문에 setter 메소드를 사용하지 않는 이유는 성능과 관련이 없다 (마이크로 초를 말함). 의미 있고 읽기 쉬운 코드를 사용하는 것과 관련이 있습니다. 속성의 새로운 값을 사용할 수있는 경우 public 속성을 업데이트하는 setter 메서드가 없어야합니다 ... '$ this-> property = $ value;'가 작동 할 때 왜 메서드를 작성하겠습니까? 내가 생각할 수있는 유일한주의 사항은 당신이 어딘가에 당신이 부동산을 비공개로 만들거나 미래에 좀 더 복잡한 논리를 포함하기 위해 부동산 설정 과정을 바꿀 수 있다고 의심되는 경우입니다. –

+0

@ BenD 퍼포먼스에 관한 제 코멘트는 이것을 세터를 사용하지 않는 주된 이유라고 추론하는 것이 아닙니다. 고려해야 할 점, 따라서 "매우 작음". 나는 수정 된 내용, 포함 된 속성의 가시성에 달려 있다고 동의합니다. – AlexP

0

나는 생각하기를, 그것은 주로 개인적 취향에 달려있다. 그러나 생성자에서 지정해야하는 새 클래스 인스턴스와 같이 변수에 직접 설정할 수없는 값이 있습니다.

관련 문제