以前に助けを求めようとした問題がありますが、その時は解決できませんでした。そのため、問題を単純化して、これについてより具体的な助けが得られるかどうかを確認しようとしています。私を夢中にさせている…</p>
基本的に、私はこのアプリケーションの実用的な (より複雑な) バージョンを持っています。これはプロジェクト コスト計算ツールです。しかし、私は同時にアプリケーションをより良く設計する方法を学ぼうとしているので、この設計をどのように改善できるかについて意見を求めています. 基本的に私が欲しいのは、(ここでは) 2 つの場所で繰り返される条件文への入力です。以前に得た提案は、戦略パターンまたは工場パターンを使用することでした。また、マーティン・ファウラーの本で、ポリモーフィズムによる条件付きリファクタリングを提案していることも知っています。私は彼のより単純な例でその原則を理解しています。しかし、ここでこれらのことのいずれかを行うにはどうすればよいですか (適切な場合)。私の見方では、計算はいくつかの条件に依存しています: 1. それはどのような種類のサービスですか? 2. プロジェクトは小規模ですか。中か大か?(「製品は新しいものですか、それとも既存のものですか?」など、他のパラメーターも同様に異なる場合があることに注意してください。したがって、そのようなパラメーターは追加できるはずですが、例を単純にするために2つのパラメーターのみを使用するようにしました具体的な助けを得ることができます)
したがって、ポリモーフィズムを使用したリファクタリングは、最初の条件 (サービスの種類) に対して既に持っているいくつかのサブクラスを作成することを意味し、2 番目の条件 (サイズ) に対してもさらにサブクラスを作成する必要がありますか? AnalysisSmall、AnalysisMedium、AnalysisLarge、WritingSmallなど…??? いいえ、私はそれが良くないことを知っています.とにかくそのパターンを扱う方法がわかりませんか?
基本的に、戦略パターンを使用するという提案についても同じ問題が見られます (工場パターンは、上記のポリモーフィズムを達成するためのヘルパーにすぎません)。ですから、これらのクラスを最適な方法で設計する方法について具体的な提案があれば、本当に感謝しています! オブジェクトを正しく選択したかどうか、または再設計する必要があるかどうかも検討してください。(「工場のパターンを考慮する必要があります」などの回答は明らかに役に立ちません...私はすでにその道を進んでおり、この場合の正確な方法に困惑しています)
よろしく、
アンダース
コード (非常に単純化されています。データなどに構成ファイルを使用せずに、列挙型の代わりに文字列を使用しているという事実を気にしないでください。これらの設計上の問題を理解したら、実際のアプリケーションで必要に応じて実行されます。 ):
public abstract class Service
{
protected Dictionary<string, int> _hours;
protected const int SMALL = 2;
protected const int MEDIUM = 8;
public int NumberOfProducts { get; set; }
public abstract int GetHours();
}
public class Writing : Service
{
public Writing(int numberOfProducts)
{
NumberOfProducts = numberOfProducts;
_hours = new Dictionary<string, int> { { "small", 125 }, { "medium", 100 }, { "large", 60 } };
}
public override int GetHours()
{
if (NumberOfProducts <= SMALL)
return _hours["small"] * NumberOfProducts;
if (NumberOfProducts <= MEDIUM)
return (_hours["small"] * SMALL) + (_hours["medium"] * (NumberOfProducts - SMALL));
return (_hours["small"] * SMALL) + (_hours["medium"] * (MEDIUM - SMALL))
+ (_hours["large"] * (NumberOfProducts - MEDIUM));
}
}
public class Analysis : Service
{
public Analysis(int numberOfProducts)
{
NumberOfProducts = numberOfProducts;
_hours = new Dictionary<string, int> { { "small", 56 }, { "medium", 104 }, { "large", 200 } };
}
public override int GetHours()
{
if (NumberOfProducts <= SMALL)
return _hours["small"];
if (NumberOfProducts <= MEDIUM)
return _hours["medium"];
return _hours["large"];
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<int> quantities = new List<int>();
for (int i = 0; i < 100; i++)
{
quantities.Add(i);
}
comboBoxNumberOfProducts.DataSource = quantities;
}
private void comboBoxNumberOfProducts_SelectedIndexChanged(object sender, EventArgs e)
{
Service writing = new Writing((int) comboBoxNumberOfProducts.SelectedItem);
Service analysis = new Analysis((int) comboBoxNumberOfProducts.SelectedItem);
labelWriterHours.Text = writing.GetHours().ToString();
labelAnalysisHours.Text = analysis.GetHours().ToString();
}
}