애플리케이션에서 새로운 기능을 끊임없이 발견하려고 노력할 때 제안하는 솔루션이 이전에 구현한 것과 매우 유사하다는 것을 알게 되었습니까? 당신이 프로그래머라면(시작한 지 얼마 되지 않았더라도) 아마도 "예"라고 대답했을 것입니다. 소프트웨어 개발 중에 새로 발견된 문제를 해결하기 위해 일부 오래된 코드를 사용하고 있는 것 같습니다. 귀하는 귀하의 솔루션이 기본 원칙이며 귀하뿐만 아니라 모든 전문 개발자가 널리 반복할 수 있는 방법이라는 것을 깨달았을 것입니다.
실제로 프로그래밍에서는 많은 문제가 반복적으로 발생하며, 이러한 문제를 해결하기 위해 사용되는 기본 방법(또는 디자인 패턴)도 많이 등장했습니다. 디자인 패턴은 진정성 있고 신뢰할 수 있는 디자인을 사용하여 코드를 구성하는 방법을 알려주는 템플릿입니다.
디자인 패턴의 역사
디자인 패턴이라는 용어는 원래 건축 분야에서 만들어졌습니다. 1977년 저서 "A Pattern Language: Towns/Building/Construction"에서 Christopher Alexander는 몇 가지 일반적인 건축 설계 문제를 설명하고 기존의 잘 알려진 패턴 모음을 사용하여 새롭고 효과적인 설계를 시작하는 방법을 설명합니다. Alexander의 관점은 소프트웨어 개발에 잘 반영되며, 기존 구성 요소를 사용하여 새로운 솔루션을 구축하는 것에 대한 장기적인 합의가 있습니다.
모든 디자인 패턴에는 이름, 문제 설명, 솔루션 등 몇 가지 공통된 특징이 있습니다.
디자인 패턴 식별은 다른 프로그래머가 너무 깊게 공부하지 않고도 코드의 목적을 즉시 이해할 수 있기 때문에 중요합니다(적어도 이 식별을 통해 프로그래머는 패턴에 익숙해질 것입니다).
문제 설명은 이 패턴의 적용 분야를 설명하는 데 사용됩니다. ?
솔루션은 이 모델의 실행을 설명합니다. 디자인 패턴에 대한 좋은 논의는 모델 사용의 장점과 단점을 다루어야 합니다.
패턴은 특정 문제를 해결하는 효과적인 방법입니다. 디자인 패턴은 라이브러리(프로젝트에 직접 포함되어 사용할 수 있는 코드 라이브러리)가 아니라 코드를 구성하기 위한 템플릿입니다. 실제로 코드베이스와 디자인 패턴의 적용에는 많은 차이가 있습니다.
예를 들어 상점에서 구매한 셔츠는 코드 라이브러리이며 색상, 스타일, 사이즈는 디자이너와 제조업체에 의해 결정되지만 사용자의 요구 사항을 충족합니다.
하지만 매장에 마음에 드는 것이 없다면 나만의 셔츠를 만들 수 있습니다(모양 디자인, 원단 선택, 맞춤 제작). 하지만 재단사가 아닌 경우 적합한 패턴을 쉽게 찾은 다음 이 패턴에 따라 자신만의 셔츠를 디자인할 수 있습니다. 모형을 사용하면 더 짧은 시간에 능숙하게 디자인된 셔츠를 얻을 수 있습니다.
소프트웨어에 대한 논의로 돌아가서, 데이터 추출 계층 또는 CMS(콘텐츠 관리 시스템)는 라이브러리입니다. 이전에 설계되고 코딩되었으므로 요구 사항을 정확하게 충족한다면 좋은 선택입니다. 하지만 이 글을 읽고 계시다면 스톡 솔루션이 항상 효과가 있는 것은 아니라는 사실을 발견하셨을 것입니다. 이제 원하는 것이 무엇인지 알고 이를 달성할 수 있으므로 지침을 제공할 모델만 있으면 됩니다.
마지막 생각: 테일러링 모델과 마찬가지로 디자인 자체는 거의 쓸모가 없습니다. 결국, 옷의 모형을 입을 수는 없습니다. 단지 얇은 종이를 엮어서 만든 것일 뿐입니다. 마찬가지로 소프트웨어 설계 모델은 단지 지침일 뿐입니다. 프로그래밍 언어와 애플리케이션의 특성과 요구 사항에 따라 특별히 설계되어야 합니다.
이 책의 목표
이 책의 목적은 소프트웨어 디자인 패턴의 다양한 범주를 포괄적으로 소개하거나 새로운 디자인 패턴이나 용어를 개발하는 것이 아니라 소개를 강조하는 것입니다. - 알려진 기존 디자인 패턴. 이 책을 독특하게 만드는 점은 동적 웹 애플리케이션을 개발하는 데 도움이 된다고 생각되는 몇 가지 디자인 패턴을 소개하고 이러한 디자인 패턴을 PHP에서 구현하는 방법을 보여 준다는 것입니다.
객체 지향 프로그래밍 OOP
이 책의 장점 중 하나는 모든 관점이 매우 자연스러운 디자인 패턴인 OOP를 기반으로 하며, OOP를 사용하여 구현된다는 점입니다.
OOP에 대해 잘 모르신다면 관련 자료(도서, 웹사이트, 잡지, 강좌 등)를 통해 OOP를 더 잘 이해할 수 있도록 도와주세요. 대부분의 OOP 문헌은 코드 재사용, 코드 견고성, 코드 캡슐화, 다형성 및 확장성 등의 이점을 극찬합니다. 이 모두는 매우 중요하고 유용합니다. 그러나 OOP의 가장 큰 장점은 문제를 다루기 쉬운 모듈로 스스로 쪼갤 수 있다는 것입니다. 명확한 설계와 구현이 작은 모듈로 나누어져 있어 코드를 더욱 철저하게 테스트하고 이해하고 유지 관리하기가 더 쉽습니다.
독자 능력 요구 사항
이 책에서는 귀하가 이미 PHP를 유창하게 사용할 수 있다고 가정합니다. 특히 이 책에서는 독자가 이미 PHP와 PHP 구문에 대한 실무 지식을 갖고 있고 OOP를 사용하여 PHP 코드를 실행하는 기본 원칙을 이해하고 있다고 가정합니다. 이 책은 PHP 프로그래밍을 소개하는 책이 아니며, PHP의 OOP 프로그래밍을 소개하려는 의도도 없습니다.
모든 OOP 개발자가 동일한 용어를 사용하는 것은 아니기 때문에 새로운 용어가 소개되면 텍스트나 툴바에서 정의하겠습니다.
PHP4와 PHP5
내가 이 책을 쓸 당시에는 PHP5가 출시된 지 꽤 되었지만 아직 대중 커뮤니티에서 널리 채택되지는 않았습니다. 내 작업에서는 새로운 애플리케이션 개발 작업을 PHP5.0.3 환경으로 마이그레이션하기 시작했으며 지금까지 PHP5가 PHP4 코드와 이전 버전과 잘 호환되는 동시에 객체 지향 모델이 하나라는 사실을 알게 되어 기쁩니다. PHP5의 가장 중요한 새로운 기능 중 하나입니다.
다양한 PHP 버전 간의 개체 모델 간의 미묘한 차이를 다루는 좋은 기사와 가이드가 많이 있습니다. 그러나 간단히 말해서 PHP5는 다음을 제공합니다.
객체 핸들(아래에 설명됨, 자세한 내용은 2장: 객체 모델의 값 참조)?
더 나은 생성자(통일된 이름, 변경 없음) 허용)?
소멸자?
가시성(메서드 및 속성에 대한 공개, 보호, 비공개)?
예외 처리(새로운 구문을 선택할 수 있습니다. try{}catch{ } 오류 발생)?
정적 클래스?
이미지(클래스, 메서드, 속성을 동적으로 확인)?
유형 숨기기 ?
PHP5도 제공합니다. 좀 더 모호한 기능:
새로운 매직 메소드?
__get() 및 __set()을 사용하면 변수 액세스를 제어할 수 있습니다.
__call()을 사용하면 모든 속성을 동적으로 가로챌 수 있습니다. 호출된 객체의
__sleep() 및 __wakeup()을 사용하면 직렬화 메서드를 오버로드할 수 있습니다.
__toString()을 사용하면 문자열을 사용하여 객체 자체를 설명하는 방법을 제어할 수 있습니다.
자동 로딩(처음으로 클래스가 거부될 때 사용자가 자동으로 클래스를 로드하도록 허용)?
최종(이 메서드나 클래스가 하위 클래스에 의해 오버로드되는 것을 허용하지 않음) ?
객체 핸들
PHP5의 가장 큰 특징은 파일이나 데이터베이스 핸들과 유사하게 핸들을 사용하여 클래스를 정의한다는 것입니다. PHP 함수에서 객체를 사용하면 더 이상 암시적으로 객체가 복사되지 않지만 작업 핸들이 제공됩니다.
차이점을 더 명확하게 보기 위해 다음 두 가지 예를 살펴보겠습니다.
// PHP4 class
class exampleP1 {
var $foo;
function setFoo($ foo) {
$this->foo = $foo`;
}
function getFoo() {
return $this->foo;
}
}
functionchangeExample($param) {
$param->setFoo('blah');
return $param->getFoo();
}
$obj = new exampleP1;
$obj->setFoo('bar');
echo $obj->getFoo(); // bar
echo ChangeExample($obj) //blah
echo $obj- >getFoo(); // bar
PHP4에서,changeExample() 함수의 $param 변수는 $obj의 복사본이므로 이 함수는 원래 객체 값의 $foo를 변경하지 않습니다. $obj->getFoo()의 최종 출력은 'bar'입니다.
PHP5에서는 $obj가 함수의 객체 핸들일 뿐이므로 동일한 ChangeExample() 함수가 실제로 원본 객체에 영향을 미칩니다. 즉, 핸들을 사용하면 복사할 필요가 없으며 $param은 $obj 인스턴스입니다.
// PHP5 클래스
class exampleP2 {
protected $foo;
function setFoo($foo) {
$this->foo = $foo;
}
function getFoo() {
return $this->foo;
}
}
$obj = new exampleP2;
$obj->setFoo('bar') ;
echo $obj->getFoo(); // bar
echo ChangeExample($obj); //blah
echo $obj->getFoo() // 중요, 어쩌다
이 문제는 다른 객체나 이 객체의 내장 생성자(__construct)에서 $this 변수를 사용하면 더욱 복잡해집니다.
PHP4에서는 거의 항상 다음을 수행해야 합니다.
$obj=?& new class와 같은 참조 개체를 생성합니다.
참조 개체를 다음에서 호출합니다. 함수 func(?&$obj_param)와 같은 객체{}
함수와 같은 함수를 참조하여 객체를 캡처합니까? &some_func(){} $return_obj=&some_funct()
In 사실, 이제는 원본 객체도 복사해야 하는 상황이 있습니다. 내 PHP4 코드에서는 명시적 개체 복사와 같이 참조되지 않는 개체 작업에 대해 항상 명확하게 주석을 달았습니다. 장기적으로 이러한 간단한 설명은 코드를 유지 관리하는 사람의 골치 아픈 일을 크게 줄일 수 있습니다(번역자 주: 이러한 코드는 유지 관리가 매우 쉽습니다). 값에 의한 참조 전달, 객체 핸들, 객체 복사에 대한 관련 지식은 2장 "객체 패턴의 가치"에서 자세히 설명합니다.
저는 개인적으로 개발에 PHP5를 사용하는 것을 선호하지만, 우리는 오랫동안 PHP4를 계속 사용할 것이며 기존에 공개된 프로젝트에서도 PHP4를 계속 지원할 것이라고 생각합니다. 따라서 이 책에서는 두 버전의 PHP에 대해 동일한 지원을 제공합니다. PHP4, PHP5 버전의 예제 코드를 최대한 많이 제공합니다. 각 장에서 각 코드 블록(다른 PHP 버전에서 변경됨)에는 //php4 및 //php5와 같은 변경 사항을 나타내는 해당 주석이 제공됩니다.
참고문헌 및 기타 자료
여기에는 디자인 패턴을 더 잘 배우는 데 도움이 되는 관련 참고서가 많이 있습니다. 디자인 패턴의 "성경"(역자 번역: 최고의 책)은 Erich Gamma, Richard Helm, Ralph Johnson 및 John Vlissides입니다(그들의 중요한 작업은 종종 "GOF"로 축약되어 "Gang of Four"라고 불림). 그 중 4명을 대신하여 쓴 『디자인 패턴: 재사용 가능한 객체지향 소프트웨어 개발의 원리』이다.
"디자인 패턴"과 관련하여 PHP WEB 애플리케이션 디자인 패턴에 대한 다음으로 가장 유용한 책은 Martin Fowler가 출판한 Patterns of Enterprise Application Architecture(번역가의 번역: Enterprise Application Architecture Model)입니다. GOF의 책에는 일반적인 디자인 패턴이 모두 포함되어 있는 반면, Fowler의 책에는 특히 웹 애플리케이션 개발을 위한 많은 디자인 패턴이 자세히 소개되어 있습니다.
또한 많은 웹사이트에서는 디자인 패턴에 대한 풍부한 리소스를 제공합니다. 특히 대표적인 웹사이트는 포틀랜드 모델 라이브러리(http://cz.com/por/)입니다.
PHP 디자인 패턴에 대한 또 다른 웹사이트는 phpPatterns이며, 온라인 주소는 http://www.phppatterns.com입니다.
감사합니다
제 업무와 책임을 통해 제가 관심 있는 분야에서 시간의 일부를 보낼 수 있도록 해주신 상사님께 매우 감사드립니다. 그는 나에게 지식을 제공했고 그 경험을 통해 이 책을 쓸 자신감을 얻었습니다.
저에게 영감, 아이디어, 경험의 또 다른 원천은 SitePoint(http://www.sitepoint.com) 포럼입니다. 특히, Advanced PHP Forum에 정기적으로 참석하는 기고자들은 풍부한 지식과 경험을 갖고 있으며 제가 온라인에서 찾은 아이디어를 가장 관대하게 공유하는 사람들입니다. 내가 SimpleTest(http://simpletest.sf.net), WACT(http://wact.sf.net) 및 기타 귀중한 리소스에 로그인한 것은 이러한 리소스(번역자 주: SitePoint 사이트)를 통해서였습니다. PHP 프로젝트. 앞으로도 SitePoint가 PHP 개발자를 위한 풍부한 리소스가 되기를 바랍니다.
이 책은 PHP 개발팀의 기여와 상당한 노력이 없었다면 불가능했을 것입니다. 사용하기 쉽고, 배우기 쉽고, 다재다능하고, 웹 애플리케이션 개발에 매우 적합한 언어를 개발한 사람들이 바로 그들이기 때문입니다.
마지막으로 Marco Tabini와 php|architect의 모든 분들께 감사의 말씀을 전하고 싶습니다. 이 잡지(역자 주: php|architect)는 다양한 PHP 테마의 소스가 되었으며 이러한 테마는 전문 개발자에 의해 출판되었습니다. 매크로와 회사에서 주최하는 컨퍼런스도 꽤 좋습니다.
위 내용은 PHP Tutorial: PHP Design Patterns의 서문 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!