Hezký večer, code behind se nevyhnete a ani není důvod. Potíž je s třídou SteelGain, která by neměla být součástí projektu WebForms. Statickým metodám se, pokud možno, vyhněte. Pokud správně chápu, že třída SteelGain počítá váhu materiálu na plochu, v implementaci bych postupoval takto (předpokládejme, že výpočtů může být více, pro více materiálů): V business vrstvě bych implementoval (v assembly s názvem např. Business) tyto třídy a rozhraní:
// strategy
public interface IMaterialWeightCalculator
{
double Calculate(double width, double height);
}
// strategie (algoritmus) pro výpočet váhy oceli
internal class SteelWeightCalculator : IMaterialWeightCalculator
{
const double constant = 1.3;
public double Calculate(double width, double height)
{
return width * height * constant; // nějaký výpočet
}
}
// strategie (algoritmus) pro výpočet váhy vody
internal class WatterWeightCalculator : IMaterialWeightCalculator
{
const double constant = 0.6;
public double Calculate(double width, double height)
{
return (width * height * constant) * Math.Log(width + height); // nějaký výpočet
}
}
Jedná se o návrhový vzor Strategy, čili pro každý výpočet (strategii/algorimus) samostatné třídy, které implementují společné rozhraní. Pro tvoření instancí algoritmů jsem zvolil vzor Abstract factory, která mi, mimo jiné, zajišťuje, že se mi instance vytváří na jednom místě (taky v business vrstvě):
// abstract factory
public interface IMaterialWeightCalculatorFactory
{
IMaterialWeightCalculator CreateCalculator(Material material);
}
// konkrétní factory vracejíc strategy
public class MaterialWeightCalculatorFactory : IMaterialWeightCalculatorFactory
{
public IMaterialWeightCalculator CreateCalculator(Material material)
{
if (material == Material.Steel)
{
return new SteelWeightCalculator();
}
if (material == Material.Water)
{
return new WatterWeightCalculator();
}
throw new ArgumentException("Invalid material type.");
}
}
// typy materiálů
public enum Material
{
Steel,
Water
}
Použití v prezentační logice (code behind) potom následující:
private IMaterialWeightCalculatorFactory _materialWeightCalculatorFactory;
private IMaterialWeightCalculatorFactory MaterialWeightCalculatorFactory
{
get
{
return _materialWeightCalculatorFactory = _materialWeightCalculatorFactory ?? new MaterialWeightCalculatorFactory();
}
}
// pro ocel
public void buttonSteel_Click(object sender, EventArgs e)
{
var width = double.Parse(TextBox2.Text); // převzetí vstupu
var height = double.Parse(TextBox3.Text); // převzetí vstupu
var svc = MaterialWeightCalculatorFactory.CreateCalculator(Material.Steel);
TextBox1.Text = svc.Calculate(width, height);
}
public void buttonWater_Click(object sender, EventArgs e)
{
var width = double.Parse(TextBox4.Text); // převzetí vstupu
var height = double.Parse(TextBox5.Text); // převzetí vstupu
var svc = MaterialWeightCalculatorFactory.CreateCalculator(Material.Water);
TextBox6.Text = svc.Calculate(width, height);
}
Po té stavět něco nad tím, dle potřeby. Nevím, možná je to pro Váš charakter aplikace kanón na vrabce, ale člověk nikdy neví, jak se aplikace bude dál rozšiřovat, lze to jen predikovat z předchozích zkušeností. R.
|