Tworzę aplikację, która będzie używana do otwierania i zamykania zaworów w środowisku przemysłowym, i myślałam o czymś prostym:
public static void ValveController
{
public static void OpenValve(string valveName)
{
// Implementation to open the valve
}
public static void CloseValve(string valveName)
{
// Implementation to close the valve
}
}
(Implementacja zapisuje kilka bajtów danych do portu szeregowego w celu sterowania zaworem - „adres” pochodzący od nazwy zaworu oraz „1” lub „0” w celu otwarcia lub zamknięcia zaworu).
Inny twórca zapytał, czy zamiast tego powinniśmy utworzyć osobną klasę dla każdej zastawki fizycznej, której jest kilkadziesiąt. Zgadzam się, że będzie ładniej kodu pisać jak PlasmaValve.Open()zamiast ValveController.OpenValve("plasma"), ale jest to przesada?
Zastanawiałem się również, jak najlepiej poradzić sobie z tym projektem, mając na uwadze kilka hipotetycznych przyszłych wymagań:
- Jesteśmy proszeni o wsparcie nowego typu zaworu wymagającego różnych wartości, aby go otworzyć i zamknąć (nie 0 i 1).
- Jesteśmy proszeni o wsparcie zaworu, który można ustawić w dowolnej pozycji od 0-100, zamiast po prostu „otwarte” lub „zamknięte”.
Zwykle do tego rodzaju rzeczy używałbym dziedziczenia, ale ostatnio zacząłem się zastanawiać nad „kompozycją nad dziedziczeniem” i zastanawiam się, czy istnieje lepsze rozwiązanie przy użyciu kompozycji?