コンセプト、アイデア、戦略
コンセプト、アイデア、戦略競合を避けるためのスキーマの名前空間

競合を避けるためのスキーマの名前空間

WordPressディレクトリにプラグインを公開する開発者は、自分のプラグインを誰が使用するか、またそのサイトがどのような設定や環境を持つか(他にどのようなプラグインがインストールされているかを含む)を事前に知ることができません。そのため、プラグインは競合に備え、事前に防止策を講じる必要があります。

WordPressプラグインが競合を避ける方法の1つは、PHPの名前空間を使用することです。名前空間はPHPコミュニティで広く使われており、Composerのオートローディングを有効にするためにPHP標準勧告PSR-4に従っています。PHPパッケージには"vendor-name/package-name"のようにベンダー名を含める必要があり、対応する名前空間がPHPコードに記述されます。

<?php
namespace VendorName\PackageName\ClassName;

名前空間はGraphQLのコンテキスト内でも意味を持ちます。スキーマ上で発生しうる以下の競合を避けるためです。

  • 同じ名前を持つ2つのタイプが存在する
  • 同じタイプに同じ名前を持つ2つのフィールドが存在する
  • 同じ名前を持つ2つのディレクティブが存在する

名前空間はGraphQL仕様に対してリクエストされています。

At the moment all GraphQL types share one global namespace. This is also true for all of the fields in mutation/subscription type. It can be a concern for bigger projects which may contain several loosely-coupled parts in a GraphQL schema.

しかしながら、Lee Byron(Facebookで働いていた頃にGraphQLの創始者の1人)は、仕様に名前空間を追加することは必要ないと考えています。このコメントの中で、FacebookがGraphQLスキーマ内の数千のタイプを競合なく管理する方法を説明しています。

We avoid naming collisions in two ways:

  1. integration tests.

We don't allow any commit to merge into our repository that would result in a broken GraphQL schema. [...]

  1. Common naming patterns.

We have common patterns for naming things which naturally avoid collision problems. [...]

しかし、この戦略がFacebookで機能するからといって、WordPressでも機能するとは限りません。FacebookはGraphQLスキーマへのすべての入力を管理しているため、エンティティの命名に関する手順に従い、競合が生じないようにすることができます。しかしWordPressサイトはサードパーティのプラグインに大きく依存しており、それらのプラグインがどのように作られているかを管理することはできません。

例えば、あるサイトがWooCommerceとEasy Digital Downloadsの両方のプラグインを使用していて、どちらもGraphQLスキーマにProductという名前のタイプを持っていた場合、競合が発生します。サイトオーナーにできる唯一の対処法は、どちらかの会社に連絡してコードを修正するよう依頼することです。これは予防ではなく事後対応であり、信頼性に欠けます。

名前空間は、WordPressサイトオーナーにコードが常に動作するという安心感を与えることができます。2つのタイプがProductという名前を持つ場合、サイトの管理者はGraphQLスキーマで名前空間を有効にすることができ、これらのタイプは自動的にWooCommerce_ProductEDD_Productにリネームされ、競合を回避できます。

さらなるメリットとして、名前空間はGraphQLスキーマをより洗練されたものにします。WooCommerceが自社プラグインとの競合が発生しないことを確実にしたい場合、タイプ名自体に「名前空間を付ける」必要があります。例えばWCProductWCDownloadWCPayment(あるいは常に動作することを完全に確信するためにはWooCommerceProductWooCommerceDownloadWooCommercePaymentとするかもしれません)。名前空間のおかげで、これらのタイプはProductDownloadPaymentというより自然な名前を持つことができます。