Какой самый простой способ передать наборы параметров между взаимозависимыми методами без повторения кода?
Таким образом, у меня есть ситуация, в которой мне нужно множество методов, которые используют друг друга для передачи наборов параметров. Тем не менее, это не выглядит возможным без большого количества грязного кода. Код написан на C#, но позже я объясню, почему это не важно. Итак, у меня есть следующий метод:
private void UpdateBond(Bond bond)
{
Atom a1, a2;
GetBondAtoms(bond,out a1,out a2);
float distance = GetDistance(a1,a2);
UpdateBondOrder(bond, a1, a2);
//if the bond will break then remove from bond matrix
//and re-pool
if (!bond.Delegate.UpdateBond(distance, a1, a1.Delegate, a2, a2.Delegate))
{
DisconnectBond(bond);
}
}
Однако мне нужно разделить его на три метода. Тот, который обновляет состояние химической связи, тот, который просто измеряет энергию химической связи, не изменяя ее состояние, и тот, который обновляет связь, но одновременно измеряет энергию связи (поскольку существует способ сделать это, который является более оптимальным, если вам нужно сделать их оба одновременно). Так, например, два других метода могут (но, вероятно, не должны) выглядеть так:
private float UpdateBondAndGetEnergy(Bond bond)
{
Atom a1, a2;
GetBondAtoms(bond,out a1,out a2);
float distance = GetDistance(a1,a2);
UpdateBondOrder(bond, a1, a2);
float energy = 0;
//if the bond will break then remove from bond matrix
//and re-pool
if (!bond.Delegate.UpdateBond(distance, a1, a1.Delegate, a2, a2.Delegate,out energy))
{
DisconnectBond(bond);
}
return energy;
}
private float GetBondEnergyOnly(Bond bond)
{
Atom a1, a2;
GetBondAtoms(bond,out a1,out a2);
float distance = GetDistance(a1,a2);
//if the bond will break then remove from bond matrix
//and re-pool
return bond.Delegate.UpdateBondEnergy(distance)
}
Я чувствую, что это не подходит, потому что в первых нескольких строках методов и в конце есть повторение кода. Я хочу максимально использовать код, особенно в тех случаях, когда методы намного сложнее (например, что если логика в начале и в конце метода стала более длинной и сложной?). Но главное, на что нужно обратить внимание, это то, что я не могу просто переместить код, который хочу повторно использовать, в другие методы, потому что есть несколько параметров, которые он должен будет вернуть. Чтобы решить эту проблему, я не могу использовать следующие виды решений:
- специфичные для языка опции, такие как использование большего и большего количества параметров.
- Я не хочу решать эту проблему только для этого случая. Было бы хорошо узнать решение, которое будет хорошо масштабироваться, например, если эти методы резко возрастут в сложности. Также, как вы могли бы сказать, у меня похожая проблема с вызовами методов делегата, поэтому эта проблема может рекурсивно проникать в код.
- Я не могу выделить во время выполнения, потому что сборка мусора может привести к его заиканию, чего я не хочу по разным причинам. Так что нет создания новых объектов. Но точно так же я не хочу полагаться на структуры, потому что это также решение для конкретного языка.
Теперь я объясню, что я уже подумал:
- Объекты параметров (которые передают экземпляры атомов и значения расстояния и т. Д.). Создание объекта параметра только для этих методов не кажется мне хорошим решением, потому что есть еще несколько методов, которые имеют похожую проблему. Таким образом, класс будет заполнен ими, и они будут запутанными и нечитаемыми, потому что они подходят только для передачи нескольких параметров в очень конкретном случае. Короче говоря, это решение плохо масштабируется.
- Метод с большим количеством параметров. Я хотел бы избежать этой ситуации, потому что это решение для конкретного языка, а также оно не будет хорошо масштабироваться. Что если бы было 10 параметров, которые нужно было распаковать и передать? Это может создать невероятно запутанный и нечитаемый код.
- Полиморфизм. Так что я подумал о передаче какого-то делегата, который каждый раз делает что-то новое. Но как-то придется учитывать необязательный параметр энергии и иметь возможность возвращать разные типы. Так что я не могу понять, как это будет работать.
- Флаги и списки. Я действительно не хочу прибегать к этому решению, потому что оно вообще плохо масштабируется, а также не очень сплоченно, потому что я бы в итоге выбрал один метод, который бы делал много разных вещей.
Есть идеи?