ヘルパーとは何ですか?デザインパターンですか?それはアルゴリズムですか?


40

たぶん少し冗談かもしれませんが、Googleでどこにもこの答えが見つからないので、ソフトウェアエンジニアリングが答えを持っていることを確認します。

ヘルパーとは何ですか?

セマンティクスが深く意味のあるように、どこでも使用されている名前(モジュール名、クラス名、メソッド名)を見てきましたが、コンピューターサイエンスの文脈では(学位はありませんが)どこにも説明や定義を見たことがない!

デザインパターンですか?それはアルゴリズムですか?私はかつてモジュールとクラスの両方がsomethingthinghelpersomethingthingはかなり一般的でもある)と呼ばれるプログラムで働いていましたが、すぐにそれを私にとって意味のあるものに名前を変更しましたが、ここで何かを見逃しているように感じます!


9
ヘルパーは、何を呼ぶべきかわからないが、その友人の1人を知っているときに、あなたが何かと呼ぶものです。アーロンの代わりに「ザックの友達」と呼ぶようなものです。ダブルプラス悪い。
david.pfx 14

ヘルパーは、同型までの任意のプライベートメンバーです。
トーマスエディング14

@ThomasEdingは3年後に戻ってきてすみません-しかし、インターフェイスを含む「ヘルパー」と呼ばれる「パブリック」メンバーをたくさん見ました。私はあなたの定義のソースが欲しいです(より高い品質が良い)、それは間違いなくより多くのコードの匂いの感覚を与えるからです。
アーロンホール

回答:


63

ヘルパークラスはあまり知られていないコードの匂いで、コーダーがその他の一般的に使用される操作を特定し、不自然なグループにまとめて再利用可能にしようとしました。その後、後続の開発者がプロ​​ジェクトに参加しましたが、ヘルパークラスが存在することに気付かなかったため、同じ共通操作を書き直したり、さらにヘルパークラスを作成したりしました。

しかし、真剣に、ヘルパークラスの主な問題は、通常、特定のクラスに作用する操作であるということです。これは、オブジェクト指向用語では、明らかに機能En望の深刻なケースに苦しんでいることを意味します。この動作が動作するデータでパッケージ化されないことが、開発者が(私の経験では)見つけられないことが非常に多い理由です。

これに加えて、SomethingSomethingHelperが既に特定されているように、実際にはひどい名前です。それは説明的ではなく、クラスがどのような操作を行うのかを実際に知ることはできません(それは役立ちますか?)、それはヘルパークラスに属しているかどうかにかかわらず、新しい動作を追加するときに明らかではないことも意味します。そのようなクラスを、論理的にグループ化する関連する動作のラインに沿って分割し、新しいクラスの名前を変更して、その動作を反映します。


9
それSomethingSomethingHelperがクラスの実際の名前ではないことを十分に確認してください。コードの匂いであるかどうかは、ヘルパークラスがコードの匂いではないため、ヘルパークラスの具体性に依存しますMath
ロバートハーヴェイ14

10
@RobertHarvey - Enhに、私が見たものの大部分はしていると命名されてSomethingSomethingHelper。地獄、私は今という名前のクラスで探していますHelperMethods<company>.Helpers名前空間。私にとって、Helperクラスはと同じバケットにあり*Managerます。
テラスティン14

8
@Telastyn:おそらくそれは経験的なことでしょう。現在のプロジェクト(いくつかあります)のヘルパークラスを調べましたが、それらにはすべて意味のある名前が付いています。接尾辞が付いているのは1つだけHelperです。これは、同じ名前の.NET Frameworkのクラスと区別するためのものだと思います。何か意味のあるもので*Helperあれば、私は受け入れられると思い*ます。 HelperMethods単なる想像力の失敗です。少なくとも特定の概念的なバケットが必要です。
ロバートハーヴェイ14

4
@RobertHarvey-あなたはおそらく正しい。私の現代言語を使った仕事はすべて、列車の残骸を片付けてきました。
テラスティン14

1
「ヘルパー関数」と呼ばれるこれらのサブセットがありますが、これらは実際に有用であり、良いパターンです。たとえば、そうでなければ関数内で繰り返す必要がある一般的な行のセット-それらが表示される場所の1つの例はdo..while、言語がサポートしていないPythonのループが必要な場合です(2番目の例を参照)。もう1つはif / elif /.../ else構造ですが、上部と下部でケースを繰り返す必要があります。ただし、可能であれば、それらはその関数に対してローカルにする必要があり、通常は実際には「ヘルパー」と呼ばれません。
イズカタ14

5

ヘルパーは、外部コンポーネントを補完する限り、無害な追加のクラスまたはメソッドです。反対の場合、権限がまったくない場合、コードはその権限から除外されているため、デザインが悪いことを示します。

無害なヘルパーの例を次に示し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; }
    }
}

-1

私の会社では、各オブジェクトが2つのクラスを持つベースクラス/ヘルパークラスの方法論を使用していました。すべてのクラスプロパティと定義を含むPersonクラスと、Personクラスを操作するすべてのメソッド、SQLステートメント、およびロジックを含むPersonH​​elperクラスがあります。すべてのアプリケーションがSQLステートメントを使用してデータを操作し、必要に応じてSQLステートメントを見つけて変更することは非常に簡単だったため、これはうまく機能しました。

それ以来、私たちはすべてをPerson / Baseクラスに入れました。プロジェクトのファイル数を減らしたいため、ヘルパーの命名規則の使用をやめました。また、一部のクラス名の長さが制御不能になっていました。笑。

良い例ではありませんが、アイデアは得られます。

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

ヘルパーの命名規則を使用することが完璧な解決策であると言っているわけではありませんが、数年間はうまくいきました。


2
理由を説明しませんでした。
ロバートハーヴェイ14

2
はい、私もその説明が欲しいです。
アーロンホール14

@AaronHallあなたが彼らの選択を理解していないのは良いことだと考えてください。
レオポルドアスペルガー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.