web-dev-qa-db-ja.com

アプリの一部が異なる言語で記述されている場合、データ構造の重複を回避するにはどうすればよいですか?

例として、Javaでアプリを作成しているとします。

アプリは、Pythonで記述されたAPIサーバーと通信します。

Pythonサーバーは[〜#〜] sql [〜#〜]データベースと通信します。

JavaScriptで記述されたアプリのWebサイトもあります。

4つの異なる言語を使用すると、基本的に同じデータ構造を4つの異なる回数繰り返すことは簡単です。

たとえば、Userタイプは次のようになります(疑似コード)。

type User {
  integer id;
  string name;
  timestamp birthday;
}

プロジェクトのすべての部分で、Userの表現が必要になります。 JavaおよびPythonパーツには2つの異なるclass宣言が必要です。データベースにはUserテーブル宣言が必要です。そしてフロントエンドサイトもUserを表す必要があります。

このタイプを4回異なる回数繰り返すと、Don't-Repeat-Yourselfの原則が実際に破られます。また、Userタイプが変更された場合、これらの変更をプロジェクトの異なる部分ごとに繰り返す必要があるという問題もあります。

Googleの protobuf ライブラリは、特別な構文を使用してデータ構造を記述し、ライブラリが複数の異なるプログラミング言語で構造宣言を生成するという、この問題に対する一種のソリューションを提供することを知っています。しかし、これはまだ型の検証ロジックを繰り返す必要があるという問題には対処していません。

これについて本やブログの投稿への提案やリンクはありますか?

12
Normangorman

そうしない。または、実際には、すべきではありません。

アプリ、サーバー、ウェブサイトを別々のコンテキストとして考える場合、構造が重複していることは理にかなっています。それが良いことである理由:

  • 構造は似ていますが、同じではありません。構造の90%がすべてのコンテキストで同じであっても。その10%はあなたに大きな頭痛を与えるでしょう。
  • パターンと実装は異なる場合があります。異なる言語とフレームワークを使用すると、それらすべてに同じ実装を行うのが非常に難しくなります
  • 共有構造は依存関係になり、管理する必要があります。依存関係を共有すると、ある状況で大きな変化が他の状況ではひどいため、開発が非常に複雑になります。したがって、この共有依存関係の開発を調整するには、多くの努力が必要です
  • コンテキストが異なれば、デプロイメントも異なります。すべてのコンテキストで同じデータ構造と同じ検証コードを共有しても、他のバージョンが古いバージョンにあるときに、あるバージョンの新しいバージョンがデプロイされる場合があるため、バージョンの同期が取れていない状況でも、対処される

DRYの原則はすばらしいですが、コンテキストまたはレイヤー間でデータ構造を共有すると、解決するよりも多くの問題が発生します。特に、プロジェクトが大きくなり、さまざまな人々がさまざまなコンテキストで作業している場合。

12
Euphoric

@Euphoricが、コードを複製しない理由をいくつか挙げました。ただし、そうする必要がある場合は、コード生成を使用することをお勧めします。

データの正規形を見つける

これを効果的に行うには、最初にデータの正規形を見つける必要があります。それはあなたのSQLスキーマですか、それともJavaプログラムのクラスですか?

それから他のフォームを(自動的に)派生させる

その後、正規のフォームから他のすべてのフォームを生成する方法を考案します。たとえば、正規形式がSQLスキーマであるとすると、JavaScript、Java、およびPythonコードを簡単に生成できます(SQLは簡単に解析され、正規ソースの候補として最適です)。

違いに対応する

生成されたコードのセクションを「触らない」としてマークするのは簡単なはずです。これにより、さまざまな表現すべてに必要な違いに対応できます(たとえば、JSフロントエンド用に記述したカスタムコードとJavaバックエンド)再生成後も保持する必要があります。
Gitから例を挙げます。エディターを開いてコミットメッセージを入力できるようにすると、ファイルにはすでにテキストが含まれていますが、# -------- >8 --------マーカーyourコンテンツの終了位置とits自動生成テキストの開始位置を確認します。

それでも、可能であれば-そのような重複を避けてください。ほとんどのコードが自動的に生成されたとしても、これはPITAです。


この答えは、「ここにいくつかのベストプラクティス」ではなく、ちょっとした話です。私が説明したのは、あなたと同じ問題があり、システムの異なる部分で同じデータを表す必要があるときに、私がかつて行ったことです(または、2つの異なるシステムで)。

5
Mael