간단한 php 함수에서 "의존성 주입"을 어떻게 사용할 수 있으며, 번거롭게 해야 합니까?
저는 사람들이 의존성 주사와 그것의 이점에 대해 이야기하는 것을 항상 듣지만, 저는 그것을 정말 이해하지 못합니다.
데이터베이스 연결을 항상 인수로 전달하는 문제에 대한 해결책인지 궁금합니다.
위키백과의 항목을 읽어보려 했지만, 예제가 자바로 작성되어 있어서 차이점을 확실히 이해할 수 없습니다.( http://en.wikipedia.org/wiki/Dependency_injection ).
저는 이 의존성-비의존성 기사(http://www.potstuck.com/2009/01/08/php-dependency-injection/ )를 읽었는데, 그 목적은 객체에 의존성을 직접 전달하는 것이 아니라 객체의 종속성 생성과 함께 객체의 생성을 차단하는 것인 것 같습니다.하지만 저는 그것을 php 함수를 사용하는 상황에서 어떻게 적용해야 할지 잘 모르겠습니다.
추가적으로, 다음의 의존성 주입은 기능적 맥락에서 의존성 주입을 시도해야 합니까?
버전 1: (매일 만들지만 좋아하지 않는 코드 종류)
function get_data_from_database($database_connection){
$data = $database_connection->query('blah');
return $data;
}
버전 2: (데이터베이스 연결을 통과할 필요는 없지만, 종속성 주입은 아닐 수도 있습니다.)
function get_database_connection(){
static $db_connection;
if($db_connection){
return $db_connection;
} else {
// create db_connection
...
}
}
function get_data_from_database(){
$conn = get_database_connection();
$data = $conn->query('blah');
return $data;
}
$data = get_data_from_database();
버전 3: ("객체"/데이터 생성은 별도이며 데이터베이스 코드는 그대로이므로 이것이 종속성 주입으로 간주될 수 있습니까?)
function factory_of_data_set(){
static $db_connection;
$data_set = null;
$db_connection = get_database_connection();
$data_set = $db_connection->query('blah');
return $data_set;
}
$data = factory_of_data_set();
방법과 이점을 명확하게 만드는 좋은 리소스나 통찰력을 가진 사람?
종속성 주입은 "내 생성자에 매개 변수가 몇 개 더 있습니다"를 나타내는 큰 단어입니다.
그것은 당신이 글로벌을 좋아하지 않았을 때 끔찍한 싱글턴 파동 이전에 했던 것입니다.
<?php
class User {
private $_db;
function __construct($db) {
$this->_db = $db;
}
}
$db = new Db();
$user = new User($db);
하나의 클래스를 사용하여 종속성을 관리하는 것이 중요합니다.
class DependencyContainer
{
private _instances = array();
private _params = array();
public function __construct($params)
{
$this->_params = $params;
}
public function getDb()
{
if (empty($this->_instances['db'])
|| !is_a($this->_instances['db'], 'PDO')
) {
$this->_instances['db'] = new PDO(
$this->_params['dsn'],
$this->_params['dbUser'],
$this->_params['dbPwd']
);
}
return $this->_instances['db'];
}
}
class User
{
private $_db;
public function __construct(DependencyContainer $di)
{
$this->_db = $di->getDb();
}
}
$dependencies = new DependencyContainer($someParams);
$user = new User($dependencies);
당신은 당신이 단지 또 다른 부류이고 더 복잡하다고 생각해야 합니다.그러나 사용자 클래스는 다른 클래스와 마찬가지로 메시지를 기록하기 위해 무언가가 필요할 수 있습니다.하면 getMessageHandler 함수가 생성됩니다.$this->_messages = $di->getMessageHandler()사용자 클래스로 이동합니다.나머지 코드에서 변경할 내용이 없습니다.
당신은 심포니의 의사에게 많은 정보를 얻을 것입니다.
IS 종속성 주입의 첫 번째 예에서는 데이터베이스 개체에 대한 종속성을 함수에 주입합니다.
사라는 이것이 아니라고 말했지만, 나는 그녀가 다음 단계인 의존성 주입 용기를 생각하고 있다고 믿습니다.
당신의 예들 중 어느 것도 의존성 주입처럼 보이지 않습니다. 하지만 버전 1이 가장 가깝습니다.종속성 주입은 개체 지향 프로그래밍에서 사용되는 기술로, 개체의 생성자가 필요한 서비스 개체에 대한 인수를 가지고 있으며 이러한 서비스 개체는 인스턴스의 생성자(공장, 테스트 또는 종속성 주입 프레임워크일 수 있음)에 의해 전달됩니다.
'항상 연결 개체 전달' 문제를 해결하려면 템플릿 패턴을 고려해야 합니다.템플릿 패턴은 기본적으로 반복되는 코드 블록의 공통 부분이 있는 추상 기본 클래스이며, 이러한 반복되는 코드 블록의 인스턴스 간의 변동을 허용하는 추상 메서드입니다.기본적으로 기본은 코드 블록의 템플릿이고 추상적인 방법은 채울 빈칸입니다.저는 개인적으로 Java에서 데이터베이스 리소스를 제어하기 위해 템플릿 메소드 패턴을 사용합니다.
저는 이 주제에 대해 직접 많은 검색을 해봤지만(PHP 의존성 주입) 마음에 드는 것을 많이 찾지 못했습니다.다른 언어(Google Guice - http://code.google.com/p/google-guice/ ; Java Spring)에 대한 주제에 대해 많이 쓰여졌지만 PHP에 대해 사용할 수 있는 내용을 찾지 못했습니다.그러나 언어에 관계없이, 도전은 비슷합니다.
질문에 나열된 세 가지 버전이 일반적인 접근 방식입니다.버전 3은 제가 본 산업의 발전 방향에 가장 가까운 것입니다.종속 개체를 만드는 책임을 클래스 외부로 이동함으로써 테스트 코드에서 원하는 대로 개체를 자유롭게 조작할 수 있습니다.하지만, 제가 그 접근법을 사용하면서 마주친 문제는 잠재적으로 수신 객체에 의해 사용될 수 없는 종속 객체의 긴 체인이 생성자에 있다는 것입니다. 그러나 2차 종속 객체로 전달됩니다.그것은 지저분해지고 당신은 어디서 오는 것인지에 대한 지식을 잃게 됩니다.
@Arkh와 @mmmshudup의 Dependency Container 예제는 훌륭한 시작이지만, 그럼에도 불구하고 저는 그 접근 방식에서도 한계를 발견했습니다.제가 도착한 최종 솔루션은 스칼라에서 인기 있는 케이크 패턴을 다소 본떠 만든 맞춤형 솔루션이었습니다.각 생성자에게 단일 종속성을 전달할 수 있으며 클래스당 종속 개체의 기본 구성을 정의할 수 있습니다.따라서 긴 종속성 사슬에서 벗어나 종속성의 기본 구현을 제어할 수 없게 됩니다.
저는 그 시스템을 Diesel이라고 불렀고 그것에 정말 만족했습니다.저는 관심 있는 사람들을 위해 github에 코드를 게시했습니다.당신은 제가 그 주제에 대해 쓴 블로그에서 그것을 얻을 수 있습니다. 그것은 기본적인 사용법과 당신의 질문에 대해 더 자세히 설명합니다.http://developers.blog.box.com/2012/02/15/introducting-diesel-php-dependency-injection/
종속성 주입은 두 성분이 종속적인 이유에 초점을 맞추기 위해 두 성분 간의 종속성을 제거하는 개념입니다.
다른 구성 요소 B의 서비스를 사용해야 하는 구성 요소 A가 있다고 상상해 보십시오.
만약 당신이 A 내부에 B의 존재를 하드 코딩한다면, 당신은 A가 같은 서비스를 사용하기를 원하지만 다른 구성 요소에 의해 구현되기를 원할 때 갇히게 될 것입니다.
따라서 일반적으로 B와 C가 구현할 서비스 인터페이스를 정의하고 A를 사용할 때 필요한 인터페이스와 호환되는 개체를 제공해야 합니다.
이 경우 인터페이스가 쿼리를 수행할 수 있는 서비스라고 생각할 수 있습니다.
첫 번째 경우는 의존성 주입의 개념에 더 가까운 경우입니다.
언급URL : https://stackoverflow.com/questions/2255771/how-can-i-use-dependency-injection-in-simple-php-functions-and-should-i-bothe
'programing' 카테고리의 다른 글
| 판다 데이터 프레임에서 이름 없는 열 제거 (0) | 2023.08.02 |
|---|---|
| 데이터 테이블 페이지를 사용하려면 어떻게 해야 합니까? (0) | 2023.08.02 |
| PowerShell - 시스템 디코딩.보안.읽을 수 있는 암호에 대한 SecureString (0) | 2023.08.02 |
| 리소스에서 비트맵을 설정하는 방법 (0) | 2023.08.02 |
| Android Studio는 ProGuard 매핑 파일을 어디에 저장합니까? (0) | 2023.08.02 |