ちょっと冗談かもしれませんが、Googleのどこにもこの答えが見つからないので、ソフトウェアエンジニアリングに答えがあることを確認してください:
ヘルパーとは何ですか?
名前がどこでも使用されているのを見ました。 (モジュール名、クラス名、メソッド名)、セマンティクスが深くて意味のあるものであるかのように、しかしコンピュータサイエンスのコンテキストでは(私は学位を持っていませんが)、どこにも説明や定義を見たことがありません!
それはデザインパターンですか?それはアルゴリズムですか?私はかつて、モジュールとクラスの両方が何か何かヘルパー(何か何か)と呼ばれるプログラムに取り組んだことがあります。 em>もかなり一般的でした)、すぐに自分にとって意味のある名前に変更しましたが、「ここに何かが足りない」と感じています。
コメント
- ヘルパーとは、’何と呼ぶかわからないが、yあなたはその友人の一人を知っています。アーロンの代わりに、ザックの’友達’と呼んでいるようなものです。ダブルプラス悪い。
- ヘルパーは、同形を除いて、任意の個人メンバーです。
- @ThomasEding 3年後に戻ってきて申し訳ありませんが、私は’多くの” public “メンバーが”ヘルパー
。 ‘定義のソースが欲しいのですが(品質が高いほど良いです)、コードの臭いが増えるのは間違いありません。
回答
ヘルパークラスはあまり知られていないコードの臭いで、コーダーがその他の一般的に使用される操作を特定し、それらをまとめて再利用できるようにしようとしました。不自然なグループで一緒に。その後、歴代の開発者がプロジェクトに参加し、ヘルパークラスが存在することに気づかず、その結果、同じ一般的な操作を書き直したり、さらに多くのヘルパークラスを作成したりしました。
しかし、深刻なことに、ヘルパークラスの主な問題はそれらは通常、特定のクラスに作用する操作であり、これは明らかに、OO用語で、機能の羨望の深刻なケースに苦しんでいることを意味します。動作するデータと一緒に動作をパッケージ化できないため、開発者は(私の経験では)頻繁に動作を見つけることができません。
これに加えて、SomethingSomethingHelperは実際にはひどい名前です。 。これは説明的ではなく、クラスがどのような操作を行うのかを実際に理解することはできません(それは役立ちますか?)。つまり、新しい動作を追加するときに、それらがHelperクラスに属しているかどうかは明らかではありません。論理的にグループ化された関連する動作に沿ってそのようなクラスを作成し、新しいクラスの名前を変更して、その機能を反映させます。
コメント
- かなり
SomethingSomethingHelper
がクラスの実際の名前ではないことを確認してください。’コードの臭いがあるかどうかは、特定の方法によって異なります。Math
のようなヘルパークラスはコードの臭いではないため、ヘルパークラスはです。 - @ RobertHarvey-ええと、ほとんどのクラスは’ が
SomethingSomethingHelper
という名前になっているのを見たことがあります。’ mは、現在<company>.Helpers
名前名のHelperMethods
という名前のクラスを見ています。私にとってはクラスは*Manager
と同じバケットにあります。 - @Telastyn:おそらく’それでは、経験的なことです。 ‘現在のプロジェクトのヘルパークラス(いくつかあります)を調べましたが、すべて意味のある名前が付いています。 ‘の末尾に
Helper
が付いているのは’だけです。Helper
div id = “0933616a57”>
は、同じ名前の.NETFrameworkのクラスから明確にします。 ‘*
が何か意味のあるものであれば、*Helper
は許容できると思います。HelperMethods
は単なる想像力の失敗です。少なくとも特定の概念的なバケットが必要です。
do..while
ループが必要な場合です。 ‘はサポートしていません(ここの2番目の例を参照)。もう1つはif / elif /…/ else構造ですが、上部と下部でケースを繰り返す必要があります。ただし、可能であれば、それらはその関数に対してローカルにする必要があり、通常は実際には” helper “とは呼ばれません。回答
ヘルパーは、外部コンポーネントを補完する限り、無害な追加のクラスまたはメソッドです。逆の場合は、コードが権限から除外されているため、設計が不適切であることを示します。権限がある場合は、
これは無害なヘルパーの例です。次のメソッドを使用します。 FindRep
先行ゼロの数をカウントします。
digits = digits.Remove(0, TextHelper.FindRep("0", digits, 0, digits.Length - 2));
ヘルパーメソッドは非常に単純ですが、コピーアンドペーストするのは非常に不便であり、フレームワークは解決策を提供しません。
public static int FindRep(char chr, string str, int beginPos, int endPos) { int pos; for (pos = beginPos; pos <= endPos; pos++) { if (str[pos] != chr) { break; } } return pos - beginPos; }
そして、これが悪いヘルパーの例です:
public static class DutchZipcodeHelper { public static bool Validate(string s) { return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase); } } public class DutchZipcode { private string value; public DutchZipcode(string value) { if (!DutchZipcodeHelper.Validate(value)) { throw new ArgumentException(); } this.value = value; } public string Value { get { return value; } } }
コメント
- では、DutchZipcodeHelperの実行方法を教えてください。
- @ powder366検証はプライベートですDutchZipcodeのメソッド
回答
ヘルパーは一般的に使用される名前の追加です。
ただし、 、それはほとんど通信しませんそれが何をするかについて。使用されているのを見るたびに、最適ではない名前であることがわかりました。
実際、これはコードの臭いであり、下にある問題が多いことを示しています。
例
名前” WidgetHelper “(ここでは”ウィジェット)が表示されているとします。 “は、あらゆる種類のプログラム可能な機能の代用名であり、必ずしもUIウィジェットである必要はありません):
class WidgetHelper: ...
名前から何を学びますか?オブジェクトまたは関数がウィジェットに続いて何らかの作業を行うことはわかっています。私の経験では、これは実際には当てはまらない可能性があり、名前から” helper “を削除して、コミュニケーションを改善する可能性があります。
別の可能性として、” WidgetHelper “がウィジェットをラップして、ウィジェットコード自体が認識できるようにすることができます。ヘルパーについては何もありません。これは、この擬似コードの例のWidgetHelper
がパブリックAPIの一部であることを意味します。
class WidgetHelper: def __init__(self): self.widget = Widget() ...
この場合、” WidgetAPI “のような名前の方が適切です。これは、少なくとも、Widgetクラスとの関係をユーザーに通知するためです。または、名前から” Helper “を削除し、さらにWidget
の名前を次のように変更します。 WidgetImplementation
。
または、ウィジェットによってラップされて呼び出されることもあります。これは、パブリックAPIの一部ではないことを意味しますが 実装の詳細の一部です。
class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...
この場合でも、これを使用します”ヘルパーで改善された少量の情報。”
WidgetImplementation。”
“実装”は、実装がより正確な名前を付けるには多すぎる可能性があるため、正しい可能性があります。または、それ自体があいまいすぎる可能性があります。これは、名前の作成者の裁量によるものです。
しかし、これまで見てきたように、名前、” helper、”は、対象となる主要なオブジェクトに付随するものであることを除いて、コードで何が起こっているのかを理解するのに役立ちません。”ヘルパー、”は、さまざまな種類の関係を意味する可能性があります。したがって、それは過度に曖昧で曖昧であり、オブジェクトの機能をユーザーに通知する目的には適していません。
結論
名前を付けることは、コンピュータサイエンスの難しい問題の1つです。
名前で望ましいのは、名前を付けたものが何をすべきかをユーザーに知らせることです。
ただし、どのような場合でも、” helper “以外の名前を使用するか単に使用する方がわかりやすいでしょう。完全に削除します。
私の経験とこの議論の結果として、名前に”ヘルパー”を選択したことも示しています。ネーマー側の労力または洗練度が低い(正しくまたはそうでない)。確かに、これはコードの臭いです。
“ヘルパーとは呼ばないでください。”
回答
実際にはどちらでもありません。
“ヘルパー”は、関数のグループの集合名詞です。
ヘルパーは、プロジェクト全体で機能し、小さなことを行うものです。これらの人は、クラスに編成されていないことが多く、言語自体の機能を拡張するだけです。ヘルパーの非常に良い例として私が考えるものは次のとおりです。
function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }
この小さな関数は、コードの編成方法に大きな影響を与える可能性があります(リテラルリストを複数行の文字列に配置するのが好きです)が、それ自体はほとんど意味がありません。これは「栄光の正規表現パターンです。それでも、次のように言うと、コードがはるかに読みやすくなります
$a = linesOf(" apples bananas cherries ");
同等の純粋な正規表現の代わりに。
これがヘルパーです。特定のクラスに属していない、一般的なジョブ用の小さなツール。それらを1つに強制することができます(linesOfは文字列クラスのメソッドである可能性があります)が、実際に属するのは、グローバル名前空間またはそのようなツールの1つの静的コレクションです。
経験則:役立つがどこにも属していないように見える場合は、おそらくヘルパーです。
回答
もちろん”これは灰色の領域です”私の実際的な経験では、人々は”ヘルパー”を発明し、彼らが身に付けている一般的なコードのセットを特定しました。 「再実装したくない。 (一部の言語では、これらを”ミックスインと呼びます。”)
問題は、共通コードが接線的に他の各クラスに関連していて、”役立つ可能性があります。”一部ではなく厳密なクラス階層であり、”が” [すべて…]それらを支援するだけです。この戦略はソースコードの重複を回避しますが、危険がないわけではありません。
回答
私の会社は以前ベースを使用していました各オブジェクトが2つのクラスを持つクラス/ヘルパークラスの方法論。すべてのクラスプロパティと定義を含むPersonクラスと、Personクラスを操作するすべてのメソッド、SQLステートメント、およびLogicを含むPersonHelperクラスがあります。すべてのアプリケーションがSQLステートメントを使用してデータを操作し、必要に応じてSQLステートメントを見つけて変更するのが非常に簡単だったため、これは私たちにとってうまく機能しました。
その後、すべてをPerson / Baseクラスに配置しました。プロジェクト内のファイルを少なくしたかったので、ヘルパーの命名規則の使用をやめました。また、一部のクラス名の長さが制御不能になりました。笑。
良い例ではありませんが、アイデアは得られます。
s = CompanyName.PersonHelper.GetPerson() s = CompanyName.Person.GetPerson()
ヘルパーの命名規則を使用することが完璧だと言っているわけではありません。解決策ですが、数年間は機能しました。
コメント
- しませんでした’ t理由を説明してください。
- はい、’その説明もお願いします。
- @AaronHallあなたが理解していないのは良いことだと考えてください。
- 通常の理由は”誰かがそれは良い考えだと思った”です。