마 젠토 2 DI 모범 사례


19

내가 Magento 2 확장을 만들고 있다고 가정 해 봅시다 ... 음 ... 중요하지는 않습니다. 그것이 매우 멋진 일을한다고 가정 해 봅시다.
그러나 다른 개발자가 표준을 확장 할 수 있도록 적절한 표준을 사용하여 빌드했는지 확인하고 싶습니다.

언제 인터페이스와 함께 DI를 사용해야합니까?
여기서 명확하게하는 것이 핵심 예입니다.

클래스 Magento\Core\Helper\Data에는 다음과 같은 생성자가 있습니다.

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

내 질문은 var에 중점을 둡니다 \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(동일한 생성자에 다른 사람들이 있지만 하나의 설명이 내가 생각하는 모든 경우에 적합하다는 것을 알고 있습니다).

에 따르면 di.xml핵심 모듈에서 VAR은의 인스턴스가 될 것입니다 Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

하지만 필요한 경우 쉽게 변경할 수 있습니다.

코드에서 인터페이스를 언제 사용해야합니까? 이러한 인터페이스를 사용한
불완전한 샘플 모듈 (광고용으로 죄송합니다)을 만들었지 만 모두 핵심 요소입니다. 나는 내 자신의 것을 만들지 않았습니다. 내가해야합니까?


"매우 대단한 일을한다고 해보자." stackexchange에서 온라인 상태로 떠 다니는 사람들의 머리가 있습니까? 내가 그것을 설치할 것입니다;)
David Manners

1
@DavidManners 1.x 확장명을 모두 2.0으로 이식하여 이식하려고합니다. 떠 다니는 부분에 대해서는 잘 모르지만, 내가 할 수있는 것을 볼 수 있습니다.
Marius

Mage2와 관련된 질문이 아닌 Imho는 더 일반적으로 "인터페이스를 사용할시기"입니다. 누군가가 확장을 확장 할 수있는 위치에 따라 다릅니다. 비즈니스 로직으로 작업하는 모든 곳에서 말할 수 있습니다. ;) 동작이없는 객체 (예 : 간단한 데이터 객체)는 일반적으로 변경되지 않습니다.
Tobias

1
@TobiasZander, 당신은 거의 모든 인터페이스를 만들어야한다고 말합니까? 젠장, 그건 많은 일이야.
Marius

@Marius, 100 % 융통성을 원한다면 어떻게 든 그렇습니다. 그러나 나는 그것을 과도하게 엔지니어링하지 않을 것입니다. 나도 개인적으로 odetocode.com/blogs/scott/scottive/2009/06/08/… 을 소개합니다. 실제로 유용 할 때의 소개
Tobias

답변:


9

Mage2와 관련된 질문이 아닌 Imho, 더 일반적으로 "인터페이스를 사용할시기". 누군가가 확장을 확장 할 수있는 위치에 따라 다릅니다. 비즈니스 로직으로 작업하는 모든 곳에서 말할 수 있습니다. ;) 동작이없는 객체 (예 : 간단한 데이터 객체)는 일반적으로 변경되지 않습니다.

100 % 유연성을 유지하려면 어떻게 든 모든 곳에서 인터페이스를 사용해야합니다. 그러나 나는 그것을 과도하게 엔지니어링하지 않을 것입니다. 나는 개인적으로 http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx 를 실제로 유용 할 때 소개로 좋아 합니다.


7

Magento2는 SOLID 원칙 의 사용을 장려합니다 .

의존성 역전 원칙에 따르면 코드는 추상화 (인터페이스)에 의존해야한다고합니다.

인터페이스 분리 원칙에 따르면 많은 클라이언트 별 인터페이스가 하나의 범용 인터페이스보다 낫습니다. 클래스는 보호 된 인터페이스를 정의 할 수 있으므로 아키텍처 관점에서 인터페이스가 더 선호됩니다.

또한 PHP는 클래스의 다중 상속을 지원하지 않지만 인터페이스의 다중 구현을 지원합니다. 인터페이스의 또 하나의 요점입니다.

따라서 간단한 규칙을 사용할 수 있습니다. 무엇을 사용해야할지 모르는 경우 항상 인터페이스를 사용하십시오 .

추신. 성능 인터페이스를 사용하지 않는 것은 아닙니다.


인터페이스 사용이 성능에 어떤 영향을 미치는지 궁금합니다.
amitshree

1
자동 불러 오기 기능은 무료가 아닙니다. 예를 참조하십시오 : ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.