基本的に聞こえるかもしれませんが、最近startHttpServer
と呼ばれるメソッドは、まだ実行されていない場合にのみサーバーを起動するため、理解するには複雑すぎると同僚に言われました。 「本気か。私は何十年もこれをやってきた-プログラミングの一般的なパターンだ」と答えると、私は問題に遭遇します。私が認めるよりも頻繁に、彼は、プログラミングコミュニティ全体が彼の視点の背後にあり、私はひどく感じてしまうことを示すいくつかの文書化された証拠を返します。
質問:必要なアクションがすでに有効になっている場合に何もしないメソッドのコンセプトの背後にある文書化された設計パターンはありますか?または、パターンでない場合は、名前も付いていますか?そうでない場合、この方法でメソッドを記述することを検討するのが複雑すぎると考える理由はありますか?
NickWilliamsとして すでに述べました :OPが説明する概念はidempotentと呼ばれます(名詞べき等性)。これは確かに、特に高レベルAPIでは一般的な方法です。
startHttpServer
の代わりにmakeSureHttpServerIsRunning
またはensureHttpServerIsRunning
と呼びます。
関数がstartHttpServer
と呼ばれる場合、読者はその関数がHTTPサーバーを起動することを期待します。連続して10回呼び出されると、10台のサーバーが実行されます。ほとんどの場合、関数はそれを行いません。さらに、「start」の付いた名前は、サーバーを1つだけ実行したい場合は、関数がすでに呼び出されているかどうかを追跡する必要があることを示しています。
関数がmakeSureHttpServerIsRunning
と呼ばれる場合、HTTPサーバーが実行されていることを確認するために必要なことを行うと思います。おそらく、既に実行されているかどうかを確認し、そうでない場合は開始します。また、関数はサーバーが実際に実行されていることを確認するものと想定しています(サーバーの起動には、まだ完全に実行されていない時間がかかる場合があります)。
名前をEnsureServerRunning
に変更します。
完全に明確であり、再起動を意味することなく、実行されていることを確認します(実行されていない場合)。
(代替:StartServerIfNotRunning
?)
実際にはデザインパターンではありませんが、私はあなたのメソッドidempotentを呼び出します。通常、この用語はリモートコールを指すために使用されますが、説明はあなたがしていることと一致しているようです。
べき等メソッド。メソッドは「エラーの可能性」のプロパティを持つこともできます(エラーまたは期限切れの問題は別として)N> 0の同一リクエストの副作用は単一リクエストの場合と同じです。 ( W3.orgから )
ここでのサーバーの副作用は、メソッドが呼び出されるとhttpサーバーが起動することです。これを行う方法には何の問題もありません。
デザインパターンが必要な場合は、httpServerを、初期化時に開始されるシングルトンとして公開できます。
これを実装する人tool、startHttpServer
として、あなたはそれを最もシンプルでスムーズでにしようとする必要があります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
を使用します。
言語を指定しないため、JavaScriptの多くのライブラリには「1回」の関数 たとえば、アンダースコア があります。したがって、それがおなじみの場合は、「1回」のパターンと呼んで、メソッドの名前を変更してください。
私自身、Javaからより多く出てきて、「キャッシング」または「遅延評価」という用語が思い浮かびます。 「べき等」は技術的に正しく、特に適切です。より機能的なバックグラウンドがある場合。
あなたの同僚がstartHttpServer
がやりすぎていることを意味していると思います:
これらは、コードの2つの無関係な部分です。たとえば、デスクトップアプリケーションが起動時にまだ実行されていないことを確認する必要がある場合にも、同様の状況が存在します。アプリのインスタンスを処理するコード(たとえば、ミューテックスを使用)の一部と、アプリケーションメッセージループを開始するコードがあります。
これは1つではなく、少なくとも2つのメソッドが必要であることを意味します。
isHttpServerRunning: boolean
startHttpServer
アプリケーションのエントリポイントは最初のメソッドを呼び出し、戻り値がfalse
の場合は2番目のメソッドを呼び出します。現在、すべての方法が1つ1つのことを行っており、理解しやすいです。
serverサーバーが既に実行されているかどうかを知るために必要なロジックが複雑すぎる場合は、複数のメソッドにさらに分離する必要がある場合があります。