たとえば、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(同じコンストラクターに他のものがあることは知っていますが、私が考えるすべてのケースに1つの説明が当てはまります)。  
di.xmlコアモジュールによると、varは次のインスタンスになりますMagento\Framework\App\Config。
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />必要に応じて簡単に変更できます。
コードでそのようなインターフェイスを使用する必要があるのはいつですか?
私はこの不完全なサンプルモジュールを作成しました(広告は申し訳ありません)。そのようなインターフェイスを使用しましたが、それらはすべてコアからのものです。私は自分のものを作成していません。したほうがいい?