web-dev-qa-db-ja.com

ヘルパーとは?デザイン柄ですか?アルゴリズムですか?

多分少しのぞっとするかもしれませんが、私はこの答えをGoogleのどこにも見つけられないので、ソフトウェアエンジニアリングが答えを確実にするために:

ヘルパーとは?

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

デザイン柄ですか?アルゴリズムですか?私はかつて、モジュールとクラスの両方がsomethingsomethinghelper(ここでsomethingsomethingもかなり一般的でした)と私はすぐにそれを私にとって意味のあるものに名前を変更しましたが、私はここで何かが欠けているように感じます!

43
Aaron Hall

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

しかし、真剣に、ヘルパークラスの主な問題は、通常、特定のクラスに作用する操作であることです。これは、OO用語で 機能の羨望 。動作とそれに作用するデータをパッケージ化できないというこの失敗が、開発者が(私の経験では)頻繁に見つけられない理由です。

これに加えて、すでに確認したように、SomethingSomethingHelperは実際にはひどい名前です。説明的ではなく、クラスがどのような操作を行っているのかを実際に把握することはできません(それは役立ちますか?)。つまり、新しい動作を追加するときに、それらがHelperクラスに属しているかどうかが明確ではありません。このようなクラスを論理的にグループ化する関連する動作のラインに沿って分割し、新しいクラスの名前を変更して、その機能を反映させます。

70
Mr Cochese

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

これは無害なヘルパーの例です。私は、先行ゼロの数をカウントする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; }
    }
}
5