소행성이야기

[part 1] PHP로 좋은 객체 지향(OOP) 습관을 가집시다.

소행성왕자 2018. 7. 6. 12:00

[part 1] PHP로 좋은 객체 지향(OOP) 습관을 가집시다.



아래의 내용들은 객체지향을 공부하면서 필요한 내용을 개인적으로 보기쉽게 정리한것입니다.

잘못된 부분이 있을수도 있으니 만약 더 좋은 방법이 있다면 환영합니다.



나쁜습관 : public 노출


아래 예제에서 Person 객체의 필드는 접근자가 public 으로 직접 노출됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Person
{
    public $prefix;
    public $givenName;
    public $familyName;
    public $suffix;
}
 
$person = new Person();
$person->prefix = "Mr.";
$person->givenName = "John";
 
echo($person->prefix);
echo($person->givenName);

cs


객체에 변화가 생기면 이를 사용하는 코드도 변경해야 합니다.


위 코드를 좋은 코드로 변경해보겠습니다.

아래 코드는 public 필드 대신 private 를 가지고 되고 private 필드는 접근자 public 의 get set 메소드를 통해 외부에서 접근할수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
class Person
{
    private $prefix;
    private $givenName;
    private $familyName;
    private $suffix;
     
    public function setPrefix($prefix) {
        $this->prefix = $prefix;
    }
     
    public function getPrefix() {
        return $this->prefix;
    }
     
    public function setGivenName($gn) {
        $this->givenName = $gn;
    }
     
    public function getGivenName() {
        return $this->givenName;
    }
     
    public function setFamilyName($fn) {
        $this->familyName = $fn;
    }
     
    public function getFamilyName() {
        return $this->familyName;
    }
     
    public function setSuffix($suffix) {
        $this->suffix = $suffix;
    }
     
    public function getSuffix() {
        return $suffix;
    }
     
}
 
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");
 
echo($person->getPrefix());
echo($person->getGivenName());
cs


언뜻보기에, 이것은 훨씬 더 많은 작업처럼 보일 수 있으며 실제로 프론트 엔드에서 더 많은 작업이 될 수 있습니다.

그러나 일반적으로 좋은 OO 습관을 사용하면 향후 변경 사항이 크게 고착되므로 장기적으로 효과가 있습니다


아래코드는 조금더 개선하여 이름 부분에 대해 연관배열을 사용하도록 내부구현을 변경했습니다.

오류 처리가 더 많고 요소가 존재하는지 확인하는 데 더주의해야하지만

이 예제의 목적은 내 클래스를 사용하는 코드가 어떻게 변경 될 필요가 없는지 보여주는 것입니다.


OO 습관을 채택하는 이유는 변경 사항을 신중하게 캡슐화하여 코드가 보다 확장 가능하고 유지 관리가 가능하다는 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class Person
{
    private $personName = array();
     
    public function setPrefix($prefix) {
        $this->personName['prefix'= $prefix;
    }
     
    public function getPrefix() {
        return $this->personName['prefix'];
    }
     
    public function setGivenName($gn) {
        $this->personName['givenName'= $gn;
    }
     
    public function getGivenName() {
        return $this->personName['givenName'];
    }
 
    /* Todo */
}
 
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");
 
echo($person->getPrefix());
echo($person->getGivenName());
 
cs