1

と の 2 つのプロパティを持つオブジェクトがありTextますType

タイプのハードコーディングを避けるために、データベースに配置して、将来追加できるようにします。現時点では、タイプはURL, Username and ID.

ただし、Utility メソッドを実行して、オブジェクトがText何であるかに基づいてオブジェクトのフィールドをクリーンアップしたいと考えてTypeいます (たとえば、URL の場合は「http://」を追加します)。

switch ステートメント/if else ブロックで型をハードコーディングせずに Utilities クラスでこれを行う方法はありますか。

switch (type)
{
    case 1:
        TidyUrl();
    case 2:
        TidyUsername();
    case 3:
        TidyID();
    default:
        break;
}

この例では、データベース ('Type' テーブル) から ID をハードコーディングしていますが、これは決して良いことではありません!

これを行うより良い方法はありますか?

4

5 に答える 5

4

列挙型を使用して読みやすくすることができます。

enum MyTypes
{
 URL = 1,
 UserName = 2,
 Id = 3,
}

switch (myType)
{
    case MyTypes.URL:
        TidyUrl();
    case MyTypes.UserName:
        TidyUsername();
    case MyTypes.Id:
        TidyID();
    default:
        break;
}

この列挙型は、データベースとの調整を維持する必要があります。

于 2011-09-26T10:54:22.497 に答える
3

1つの方法は、ポリモーフィズムを使用することです。Tidy「タイプ」ごとに個別のクラスがあり、それぞれが独自のロジックを実行する、のようなメソッドを使用して共通のインターフェイスを実装します(または共通の基本クラスを持ちます) 。

于 2011-09-26T10:55:29.307 に答える
2

従来、これは共通のインターフェースを使用して処理され、実際の作業を行うための具体的な実装を動的に構築します。

例えば:

public interface ITidy
{
   string Tidy(string input);
}

その後、実装

public class UrlTidy : ITidy
{
    public string Tidy(string input)
    {
        // do whatever you need to the url
    }
}

他の種類の片付けについても同様です。UrlTidyここで、IdTidy探しているタイプから適切な具象クラス(など)をインスタンス化する方法が必要です。これを行う1つの方法は、データベースに型と一緒にクラス名を配置し、リフレクションを使用しての正しい実装をインスタンス化することですITidy。もう1つの方法は、タイプに基づいFactoryて権利をインスタンス化するために他のメソッドを使用するクラスを持つことです。ITidy

于 2011-09-26T10:57:11.680 に答える
0

使用することもできますenum Typeが、それらの定数値はコンパイル時に決定する必要があります。にクラス不変性チェックを入れてenum、がデータベースと整合性があることを確認できます。

しかし、それらをデータベースに含めると、どのように拡張可能になりますか?

于 2011-09-26T10:59:31.043 に答える
0

Odedが言ったように、列挙型を使用します。

public enum Types
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 3
}

次に、型変数を列挙型にキャストして、整数をデータベースIDにマップします。

switch ((Types)type)
{
    case Types.Type1:
        break;
    case Types.Type2:
        break;
    ...
}

お役に立てば幸い

于 2011-09-26T11:00:09.650 に答える