web-dev-qa-db-ja.com

「まだ実行されていない場合は何かを行う」の用語(または「パターン」?)

基本的に聞こえるかもしれませんが、最近startHttpServerと呼ばれるメソッドは、まだ実行されていない場合にのみサーバーを起動するため、理解するには複雑すぎると同僚に言われました。 「本気か。私は何十年もこれをやってきた-プログラミングの一般的なパターンだ」と答えると、私は問題に遭遇します。私が認めるよりも頻繁に、彼は、プログラミングコミュニティ全体が彼の視点の背後にあり、私はひどく感じてしまうことを示すいくつかの文書化された証拠を返します。

質問:必要なアクションがすでに有効になっている場合に何もしないメソッドのコンセプトの背後にある文書化された設計パターンはありますか?または、パターンでない場合は、名前も付いていますか?そうでない場合、この方法でメソッドを記述することを検討するのが複雑すぎると考える理由はありますか?

54
John Calcote

NickWilliamsとして すでに述べました :OPが説明する概念はidempotentと呼ばれます(名詞べき等性)。これは確かに、特に高レベルAPIでは一般的な方法です。

ただし、関数の名前を変更します。

startHttpServerの代わりにmakeSureHttpServerIsRunningまたはensureHttpServerIsRunningと呼びます。

関数がstartHttpServerと呼ばれる場合、読者はその関数がHTTPサーバーを起動することを期待します。連続して10回呼び出されると、10台のサーバーが実行されます。ほとんどの場合、関数はそれを行いません。さらに、「start」の付いた名前は、サーバーを1つだけ実行したい場合は、関数がすでに呼び出されているかどうかを追跡する必要があることを示しています。

関数がmakeSureHttpServerIsRunningと呼ばれる場合、HTTPサーバーが実行されていることを確認するために必要なことを行うと思います。おそらく、既に実行されているかどうかを確認し、そうでない場合は開始します。また、関数はサーバーが実際に実行されていることを確認するものと想定しています(サーバーの起動には、まだ完全に実行されていない時間がかかる場合があります)。

127
gnasher729

名前をEnsureServerRunningに変更します。

完全に明確であり、再起動を意味することなく、実行されていることを確認します(実行されていない場合)。

(代替:StartServerIfNotRunning?)

33
Stilez

実際にはデザインパターンではありませんが、私はあなたのメソッドidempotentを呼び出します。通常、この用語はリモートコールを指すために使用されますが、説明はあなたがしていることと一致しているようです。

べき等メソッド。メソッドは「エラーの可能性」のプロパティを持つこともできます(エラーまたは期限切れの問題は別として)N> 0の同一リクエストの副作用は単一リクエストの場合と同じです。 ( W3.orgから

ここでのサーバーの副作用は、メソッドが呼び出されるとhttpサーバーが起動することです。これを行う方法には何の問題もありません。

デザインパターンが必要な場合は、httpServerを、初期化時に開始されるシングルトンとして公開できます。

29
Nick Williams

これを実装する人toolstartHttpServerとして、あなたはそれを最もシンプルでスムーズでにしようとする必要がありますseamlessto use ...

関数のロジック

技術的には、startHttpServerのロジックを2つの関数およびに分割して、それらを呼び出す個別に、あなたがしていることはすべて、movingstartHttpServer 's idempotency の代わりに両方の関数を呼び出すコードにあります...さらに、両方のロジックをラップしない限り3番目の関数(最初にstartHttpServerを実行する関数)では、これにより、未乾燥のコードを記述し、startHttpServerを呼び出す必要があるすべての場所で指数関数的に複製します。つまり、startHttpServerは、isHttpServerRunning関数を呼び出す必要があります

だから私のポイントは:

  • isHttpServerRunning関数を実装します。これはとにかく独立して必要になる可能性があるためです...
  • startHttpServerを実装してisHttpServerRunningを使用し、それに応じて次のアクションを定義します...

それでも、startHttpServerに、この関数のユーザーが必要とする可能性のある任意の値を返すようにすることができます。例:

  • 0 =>サーバーの起動に失敗しました
  • 1 =>サーバーの起動に成功しました
  • 2 =>サーバーはすでに起動されています

関数の名前

まず、ユーザーの主要な目標は何ですか? HTTPサーバーを起動するには、そうですか?

基本的には、すでに始まっている何かを始めようと思っても問題ない、AKA1*1=1。したがって、少なくとも私にとっては、「ensureHttpServerIsRunning」と呼ぶことはそれほど必要ではないと思われます。関数名がどれほど長く、自然で覚えやすいものであるかについては、もっと気にかけます。

ここで、内部で関数の詳細がどのように機能するかを知りたい場合は、そのドキュメントまたはコードソースがあります。つまり、ライブラリ/フレームワーク/ API /などの他の関数と同じです...

機能を1回学習しながら、機能を複数回書き込み...

とにかく、私はstartHttpServerよりも短く、単純で、より明示的なensureHttpServerIsRunningを使用します。

7
ClemC

言語を指定しないため、JavaScriptの多くのライブラリには「1回」の関数 たとえば、アンダースコア があります。したがって、それがおなじみの場合は、「1回」のパターンと呼んで、メソッドの名前を変更してください。

私自身、Javaからより多く出てきて、「キャッシング」または「遅延評価」という用語が思い浮かびます。 「べき等」は技術的に正しく、特に適切です。より機能的なバックグラウンドがある場合。

2
user949300

あなたの同僚がstartHttpServerがやりすぎていることを意味していると思います:

  • サーバーがすでに実行されているかどうかを確認し、
  • 必要に応じてサーバーを起動します。

これらは、コードの2つの無関係な部分です。たとえば、デスクトップアプリケーションが起動時にまだ実行されていないことを確認する必要がある場合にも、同様の状況が存在します。アプリのインスタンスを処理するコード(たとえば、ミューテックスを使用)の一部と、アプリケーションメッセージループを開始するコードがあります。

これは1つではなく、少なくとも2つのメソッドが必要であることを意味します。

  • isHttpServerRunning: boolean
  • startHttpServer

アプリケーションのエントリポイントは最初のメソッドを呼び出し、戻り値がfalseの場合は2番目のメソッドを呼び出します。現在、すべての方法が1つ1つのことを行っており、理解しやすいです。


serverサーバーが既に実行されているかどうかを知るために必要なロジックが複雑すぎる場合は、複数のメソッドにさらに分離する必要がある場合があります。

2