䟋ずしおMagento 2を䜿甚しおフレヌムワヌクを開発するずきの䞋䜍互換性ポリシヌパヌト1

画像

* Magentoオフィスの壊れたクレヌンず、゚ンゞニアの1人が迅速に解決した゜リュヌションは、䞀般的な䞋䜍互換性のある修正です。





埌方互換性が重芁な理由





フレヌムワヌクを開発する際、そのいく぀かのバヌゞョンのリリヌス埌、フレヌムワヌクに基づいお独自の拡匵機胜ずモゞュヌルを開発するプログラマヌず同様に、フレヌムワヌクを賌入/ダりンロヌド/むンストヌルしたナヌザヌたたはMagentoの堎合は顧客がアップグレヌドする必芁があるずいう事実に盎面したすバヌゞョンは可胜な限り軜量でした。



顧客/ナヌザヌにずっお、プロセスは費甚察効果が高いはずです。 補品の新しいバヌゞョンぞの移行にかかる費甚には、アップグレヌド自䜓、アップグレヌド埌の自動テスト、回垰テスト、プラットフォヌムの新しいバヌゞョンによっお導入されたバグの修正、カスタマむズおよびサヌドパヌティモゞュヌルの曎新が含たれたす。 最小限にする必芁がありたす。



プラットフォヌム甚に拡匵機胜を開発するプログラマヌは、モゞュヌルが可胜な限り䞊䜍互換であるこずを望み、システムの倉曎によっおモゞュヌルのコヌドがどのリリヌスで砎損するかを事前に知っお、新しいリリヌスず互換性のあるモゞュヌルのバヌゞョンを事前に準備できるようにしたす。



その結果、フレヌムワヌク開発者は予想倖のゞレンマを思い぀きたす。より倚くの倉曎バグ修正を含むが必芁になるほど、埌方互換性のない倉曎が行われ、誰かが壊れおしたう可胜性が高くなりたす。



コヌドの埌方互換性ポリシヌ





画像



セマンティックバヌゞョニング SemVerは、ゞレンマに察する答えを提䟛し、オプション頻繁に䞋䜍互換性のあるリリヌスを拒吊しないようにしたす。



フレヌムワヌクのコンポヌネントのバヌゞョン番号は、MAJOR.MINOR.PATCHの圢匏で瀺されたす。曎新は次のずおりです。



埌方互換性ポリシヌは、コヌドベヌスで@apiアノテヌションが付けられた゚ンティティに適甚されたす。



パブリックおよびプラむベヌトコヌドの抂念





C ++たたはJavaの経隓がある開発者は、この抂念に粟通しおいたす。 プログラムが倖郚コントラクトの蚘述を含む.hヘッダヌファむルの圢匏で配信される堎合、メ゜ッドのセマンティクスは、テキスト゚ディタヌず、読みにくくお倉曎できないコンパむル枈みおよびコンパむル枈みのコヌドを含むDLLファむルで読みやすくなりたす。



蚀語レベルのPHPはこの機胜を提䟛したせん。 したがっお、この蚀語で蚘述されたフレヌムワヌクは、長い間「正しい」アプロヌチを探しおいたした。 たずえば、Magento 1は、圓時の他の倚くのフレヌムワヌクSymfony 1ず同様に、コンポヌネントをカスタマむズおよび拡匵し、子孫のクラスの動䜜をオヌバヌラむドたたは拡匵するためにクラスのいずれかから継承するこずをフレヌムワヌクが提案したずきに、継承ベヌスのAPIを䜿甚したした。 したがっお、Magento 1では、プラむベヌトプロパティずメ゜ッドはたったく䜿甚されず、Magentoコア開発者は2぀のコントラクトパブリック-パブリックプロパティ、メ゜ッド、゚ンティティ定数を圢成するコントラクト、保護-゚ンティティ継承コントラクトを監芖し、䞡方に埌方互換性のない倉曎が远加されないようにする必芁がありたした。 コヌドベヌス内のこれらの゚ンティティのすべおの゚ンティティずすべおのメ゜ッドがAPIである堎合、新しい倉曎を远加しおバグを修正するず、いずれの堎合でも誰かが壊れるこずがありたす。



この点に関しお、Magento 2では、異なるアプロヌチに埓うこずを決定したした-継承ベヌスのAPIは内郚䜿甚が犁止されおおり、サヌドパヌティの開発者がこのアプロヌチを䜿甚しおフレヌムワヌククラスたたはモゞュヌルをカスタマむズするこずはお勧めしたせん クラスの属性ずメ゜ッドにProtectedアクセス修食子の䜿甚を犁止したした。 これらの倉曎の䞻なアむデアは、パブリックずプラむベヌトのみを持぀こずです。1぀の契玄だけを監芖する必芁がありたす。パブリックです。 継承契玄はありたせん。



次のステップは、コヌドをパブリック ヘッダヌファむルのアナログ- @api



アノテヌションでマヌクされたコヌドず構造、およびプラむベヌト コンパむルされたDLLのアナログ @api



アノテヌションでマヌクされおいないコヌドに分割するこずでした。

閉じたコヌドは、サヌドパヌティの開発者による䜿甚を意図しおいたせん。 したがっお、その倉曎は、このコヌドが倉曎されたコンポヌネントのPATCHバヌゞョンの増加のみに぀ながりたす。



公開コヌドを倉曎するず、垞にコンポヌネントのマむナヌバヌゞョンたたはメゞャヌバヌゞョンが増加したす。



MINORおよびPATCHコンポヌネントのリリヌス内で@api



マヌクされたクラスずの䞋䜍互換性を@api



たす。 @api



ずしおマヌクされたクラス/メ゜ッドに倉曎を加える必芁がある堎合は、 @api



ずしおマヌクし、コンポヌネントの次のメゞャヌリリヌスより前に削陀されたす。



Magento 2の公開コヌドの定矩に該圓するものの䟋







API vs SPI拡匵ポむント





MagentoのPHPコントラクトは、さたざたな方法で䜿甚できたす。 そのような甚途は3぀ありたす。





モゞュヌルぞのすべおの呌び出しはAPIモゞュヌルサヌビスコントラクトを経由し、倖郚開発者やカスタマむザヌが代替実装を提䟛したり、そのたた実装を拡匵できるように実装するこずで、モゞュヌルもむンタヌフェむスを提䟛するこずを期埅しおいたす。 たずえば、怜玢機胜の堎合、リク゚ストを実行するアダプタヌにずらわれない契玄がありたす。 たた、このコントラクトはAPIビゞネスロゞックコヌドで呌び出されるずしお䜿甚されるこずを前提ずしおいたす。 むンタヌフェヌスのセットが提䟛されたすが、サヌドパヌティの開発者は、Sphinxなどの新しい怜玢゚ンゞンのサポヌトを远加しお、怜玢アダプタヌを実装し、その実装を提䟛できたす。 たた、これにより、Search APIを䜿甚するビゞネスロゞックが䞭断されるこずはありたせん 。



APIずSPIは盞互に排他的ではないため、コヌド内で別々に分離したせん。 SPIには@api



ず同じ泚釈があり@api



。



しかし、誰がAPIずSPIを決定するのでしょうか -それらを䜿甚する人、すなわち 倖郚開発者





䟝存関係ルヌル





たず、モゞュヌルが別のモゞュヌルをどのように䜿甚するかに応じお、モゞュヌルが互いに䟝存する必芁がある理由。

補品カテゎリリポゞトリむンタヌフェヌスがあるずしたす

メ゜ッド付き

むンタヌフェむスは、システムの以前のリリヌスで既に公開されおおり、䜿甚されおいたす。

ある時点で、このむンタヌフェヌスにgetListメ゜ッドを远加しお、指定された怜玢条件でカテゎリヌを怜玢するのを忘れたこずに気付きたす。 このメ゜ッドを珟圚のむンタヌフェヌスおよびそれを実装するクラスぞの実装に远加するず、それを䜿甚するコヌドが壊れたすか

コヌドがむンタヌフェヌスをAPIずしお䜿甚する堎合、぀たり ビゞネスロゞックでget / save / deleteメ゜ッドを呌び出すだけです。新しいメ゜ッドが出珟しおも問題は発生したせん。 既存のコヌドは匕き続き機胜したす。 モゞュヌルコヌドがこのむンタヌフェむスSPIの代替実装を提䟛する堎合、むンタヌフェむスを実装するクラスはそのメ゜ッドのいずれかの実装を提䟛しないため、アセンブリプロセス䞭に゚ラヌが発生したす。



そのため、カテゎリを怜玢するための個別のサヌビスがありたす 。



むンタヌフェむスからメ゜ッドを削陀する堎合、逆のこずが圓おはたりたす; SPIの堎合、䜿甚は倉曎を壊したせん; APIの堎合、これは問題です。

画像



API



モゞュヌルが別のMagentoモゞュヌルによっお宣蚀されたコントラクトを䜿甚する呌び出す堎合、このモゞュヌルのメゞャヌバヌゞョンに䟝存する必芁がありたす。 たた、システムはメゞャヌリリヌス党䜓で䞋䜍互換性を提䟛したす。



 { ... "require": { "magento/module-customer": "~100.0", // (>=100.0 <101.0.0) }, ... }
      
      







SPI拡匵ポむント



モゞュヌルが別のMagentoモゞュヌルによっお宣蚀されたコントラクトの実装を提䟛する堎合、このモゞュヌルのメゞャヌ+マむナヌバヌゞョンに䟝存する必芁がありたす。 システムは、マむナヌリリヌスの䞀郚ずしお䞋䜍互換性を提䟛したす。



 { ... "require": { "magento/module-customer": "~100.0.0", // (>=100.0.0 <100.1.0) }, ... }
      
      







プラむベヌトコヌドの䟝存関係





モゞュヌルが@api



ずしおマヌクされおいない゚ンティティに䟝存する堎合、モゞュヌルはメゞャヌ+マむナヌ+パッチバヌゞョンに䟝存する必芁がありたす。 そしお、すでに次のパッチリリヌスぞのアップグレヌドは、このモゞュヌルの問題になる可胜性がありたす。



 { ... "require": { "magento/module-customer": "100.0.0", // (==100.0.0 <100.0.1) }, ... }
      
      







次のメゞャヌコマヌシャルリリヌス2.2-䜕を期埅したすか





Magento 2.0.xおよび2.1.xの珟圚のバヌゞョンでは、プラむベヌトコヌドぞの䟝存関係をなくすこずはできたせん。

これには十分な@api



カバレッゞがないためです。 䞀郚のモゞュヌルには、サヌビス契玄がたったくありたせんりィッシュリストなど。 したがっお、サヌドパヌティの開発者には、apiアノテヌションクラスでマヌクされおいないクラスに䟝存する以倖の遞択肢はありたせん。



API開発は、゜フトりェアの蚭蚈ず開発における最も耇雑なプロセスです。 たた、すべおのMagentoモゞュヌルぞのサヌビスコントラクトの远加䜜業がい぀終了するのか正確にはわからないため、リリヌス2.2では、サヌドパヌティのプログラマヌによるmagentoのモゞュヌルの䜜成/カスタマむズに必芁なすべおの゚ンティティで@api



をマヌクするこずにしたした。

぀たり 2.2では、すべおの「 誠実な契玄 」、぀たり モゞュヌルが提䟛する機胜がヘルパヌたたはリ゜ヌスモデルによっお実装されおいる堎合。 たた、APIモゞュヌルを呌び出しおこの機胜を取埗するこずはできたせん。このヘルパヌを@api



ずしおマヌクし@api



。

䟋ずしお、補品゚ッセンスに察する操䜜のダむダルアップを定矩するProductInterfaceがありたす。 そしお、このむンタヌフェヌスを実装する補品モデルがありたす。 補品モデルは抜象モデルから継承し、それに応じお抜象モデルのコントラクトを持っおいるため、サヌドパヌティの開発者がProductInterfaceのみに䟝存できるずは蚀えず、このむンタヌフェむスの実装を誰かが提䟛するず、magentoの内郚実装を簡単に眮き換えるこずができたす補品モデルの盞続人でない堎合。 ぀たり Magentoの倚くのコヌドは、抜象モデルから取埗したget / setDataメ゜ッドを䜿甚しおいたす。 したがっお、ProductInterfaceの圢匏のAPIが既にあるにもかかわらず、2.2では補品モデルを@api



ずしおマヌクしたす。



リリヌス2.2より前。 コヌド党䜓が公開されおいる、぀たり すべおのクラスは埌方互換性ポリシヌの察象です。 @api



マヌクされたクラスだけではありたせん。
コンセプトのパブリックずプラむベヌトぞの分離は、2.2リリヌスから始たりたす。



では、䜿甚されおいるものずされおいないものをどのように刀断するのでしょうか。



Magentoが内郚的に䜿甚するモゞュヌル間の䟝存関係を分析したす。 たた、Marketplaceの拡匵機胜で䜿甚される䟝存関係非API䟝存関係も分析したす。 䟝存関係が有効な堎合、぀たり 珟圚のモゞュヌルAPIを䜿甚しおこの結果を取埗するこずはできたせん-゚ンティティを@api



ずしおマヌクしたす



*この蚘事はパヌト1です。 たもなくリリヌスされるパヌト2では、䞋䜍互換性ポリシヌによっお導入されるコヌドの制限ず、BCポリシヌに埓っおリファクタリングを停止せず、これらの制限による技術的負債を蓄積しないようにするために行っおいるこずに぀いお説明したす。



All Articles