소행성이야기

[part 2] PHP로 좋은 객체 지향(OOP) 습관을 가집시다. 부제: 각 모듈은 자체 오류를 처리

소행성왕자 2018. 7. 6. 13:05

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

부제: 각 모듈은 자체 오류를 처리


클래스를 만들면 자체 오류를 적절하게 처리해야합니다.

클래스가 오류를 처리하는 방법을 모르는 경우 클래스는 호출자가 이해하는 형식으로 패키지해야합니다.


또한 널 (NULL)이거나 유효하지 않은 상태의 오브젝트를 리턴하지 마십시오.


여러 번, 인수를 확인하고 제공된 인수가 유효하지 않은 이유를 나타내는 특정 예외를 throw 하여

이를 간단하게 수행 할 수 있습니다.

이 습관을 구축하면 코드를 유지 관리하거나 사람들을 사용하는 사람들이 많은 시간을 절약 할 수 있습니다.



나쁜습관 : 오류 처리 안함


아래 예제를 살펴보면, 인수를 받아들이고 일부 Person값이 채워진 객체를 리턴합니다.


그러나 parsePersonName()메서드에서는 제공된 $val 변수가 null 인지, 길이가 0 인 문자열인지 또는 구문 분석 할 수 없는 형식의 문자열 인지

확인하는 유효성 검사가 없습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class PersonUtils
{
    public static function parsePersonName($format$val) {
        if (strpos(","$val> 0) {
            $person = new Person();
            $parts = split(","$val); // Assume the value is last, first
            $person->setGivenName($parts[1]);
            $person->setFamilyName($parts[0]);
        }
        return $person;
    }
}
cs




좋은 습관 : 각 모듈은 자체 오류를 처리


설정되지 않은 변수가 유효한 결과를 생성 할 수 없으면 변수를 검사하고 InvalidArgumentException 내보냅니다.

문자열이 비어 있거나 특정 형식이어야하면 형식을 확인하고 예외를 발생시킵니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class InvalidPersonNameFormatException extends LogicException {}
  
class PersonUtils
{
    public static function parsePersonName($format$val) {
        if (! $format) {
            throw new InvalidPersonNameFormatException("Invalid PersonName format.");
        }
 
        if ((! isset($val)) || strlen($val== 0) {
            throw new InvalidArgumentException("Must supply a non-null value to parse.");
        }
    }
}
 
cs



다른 사람들이 클래스 자신의 내부 동작을 알지 못해도 클래스를 사용할 수 있기를 원한다는 것입니다.


잘못 사용하거나 의도하지 않은 방식으로 사용하면 왜 작동하지 않았는지 추측해서는 안됩니다.