ラムダとデリゲートのいくつかの基本が欠けているに違いありません。ここに行きます..
「ほぼ」同じことを行う2つの関数があります。それらを1つの関数に書き込んで「必要な」引数を渡すことで、それらをOOPする必要があります。
2 つの関数は、大まかに次のようになります。
private static bool Populate1(int yPoint)
{
//---------------------------------
//--------------------------------
int xPoint = 0;
foreach (var item in collection)
{
ComboBox cb = AddControl_Combo(item, xPoint, yPoint);
xPoint += cb.Width + 12;
yPoint = 0;
}
//-------------------------------
//-------------------------------
return true;
}
private static bool Populate2(int yPoint)
{
//---------------------------------
//--------------------------------
int xPoint = 0;
foreach (var item in collection)
{
ComboBox cb = AddControl_Combo(item, xPoint, yPoint);
yPoint += cb.Height + 12;
}
//---------------------------------
//--------------------------------
return true;
}
関数はもっと冗長なので、本当に DRY したいと思います。お気づきのように、2 つの機能の唯一の違いは、2 つのポジショニング機能です。
xPoint += cb.Width + 12;
yPoint = 0;
と
yPoint += cb.Height + 12;
上記の式を引数として渡すことで、上記の 2 つの関数を 1 つにするにはどうすればよいですか? 私が見つけた問題は、変数xPoint
とcb
がまさに関数のスコープ内の変数であることです!
これが私が試して成功したものですが、私の意見ではエレガントではありません:
private static bool Populate(ref int xPoint, ref int yPoint, ref ComboBox cb,
Action positioningFunc)
{
foreach (var item in collection)
{
cb = AddControl_Combo(item, xPoint, yPoint);
positioningFunc();
}
return true;
}
そしてそれを呼び出します:
int xPoint = 0;
int yPoint = 0;
ComboBox cb = null;
return Populate(ref xPoint, ref yPoint, ref cb, () =>
{
xPoint += cb.Width + 12;
yPoint = 0;
});
と
int xPoint = 0;
int yPoint = 19;
ComboBox cb = null;
return Populate(ref xPoint, ref yPoint, ref cb, () =>
{
yPoint += cb.Height + 12;
});
それらをOOPするより良い方法はありますか?
編集:私が渡そうとしている2つの式は、いくつかの動的コントロール(水平、垂直、斜め、ジグザグなど)を配置します。関数はすでに 4 つの異なる場所から呼び出されており、スケーリングされます。式自体を取得するために、呼び出しクラスから多くの計算を行います。そのため、 (別の Utility クラスにある) 関数if else
内でロジックを実行することは、私が望むものではありません。Populate
すべてのメソッドの唯一の変更点は、foreach 内の式の配置です。したがって、この場合の引数をどのように渡すことができるかを探しています。