Wzorzec projektowy dla problemu

Wzorzec projektowy dla problemu
AD
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:39
0

Witam
Mam 3 klasy powiedzmy podobny przykład do poniższego. Chcę wykonać operację na nich i udostępnić jakiś wspólną klasę, która wykona te 3 operacje.

Kopiuj
public static class ClassA
{
         public static void doSomething()
         {}
}

public static class ClassB
{
         public static void doSomething(string param1)
         {}
}

public static class ClassC
{
         public static void doSomething(int param2)
         {}
}
 

Innymi słowy chce stworzyć klasę która uprości to i zamiast po stronie klienta pisać za każdym razem:

Kopiuj
ClassA.doSomething(); 
ClassB.doSomething(param1); 
ClassC.doSomething(param2)

Banalne i idealnie pasuje tu wzorzec Fasady. Problem w tym, że operacje mogą być wykonywane różnie - raz metody w klasie A i B. Raz w klasie A i C, raz A, B, C. Zależy to od wyboru użytkownika. Pytanie jaki wzorzec projektowy zastosować w takim podejściu.

edytowany 2x, ostatnio: a.dudek76
Pixello
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Podkarpacie
  • Postów:448
0
fasadin
a po co mu revertowanie komend ;>?
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

zwykly polimorfizm tu sie nada. Zobacz sobie Abstract Factory Pattern

MA
  • Rejestracja:około 10 lat
  • Ostatnio:3 dni
  • Lokalizacja:Poznań
  • Postów:216
0

Niech to nie będą klasy statyczne. Może coś takiego:

Kopiuj
interface IDoSomething
{
	void DoSomething(params object[] args);
}

class ClassA : IDoSomething { void DoSomething(params object[] args) { ... } }
class ClassB : IDoSomething { void DoSomething(params object[] args) { ... } }
class ClassC : IDoSomething { void DoSomething(params object[] args) { ... } }

static class DoIt
{
	public static void Do(Type[] types, params object[] args)
	{
		foreach (var type in types)
		{
			(Activator.CreateInstance(type) as IDoSomething).DoSomething(args);
		}
	}
}


DoIt.Do(new Type[] { typeof(ClassB ), typeof(ClassC ) }, arg1, arg2);
edytowany 2x, ostatnio: _Mateusz_
fasadin
to jest dokladnie to co napisalem powyzej ;) tylko brakuje jeszcze sensownego tworzenia tych obiektow
MA
neves
to jest straszne, brzydkie, nieczytelne, używa refleksji i boxingu
fasadin
dlatego zamiast klasy DoIt jakby byl abstract factory to bylby w miare porzadek ;)
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

a nie wystarczy delegacja i klasa i przeciążona metodą dosomething?

Kopiuj

public static class ClassaZbioracza
{
        /* edit nie potrzebne bo metody w klasach sa statyczne
          static  Class1  c1Instance // itd.
          //....
         ClassaZbioracza(Class1 c1,Class2 c2,Class3 c3)
         {
                  c1Instance = c1; // itd dla kolejnych 
                  //...
           }       */
         public static void doSomething(string param1)
         {
                  Class1 .doSomething(param1)
         }
         public static void doSomething(int param2)
          { 
                  Class2 .doSomething(param2)
          }
          public static void doSomething()
         {
                  Class3 .doSomething()
         }
}
 

 

a jesli chcesz mieć kilka naraz i masz pewność ze typy ci sie nie zazębiają to możesz w pisać brzydkie przeciążenia przemnoży przez przypadki.

edytowany 4x, ostatnio: topik92
fasadin
to jest straszne rozwiazanie. co jezeli dojda Ci nowe typy? Bedziesz to tak rozszerzac? Konstruktor na 3 zmienne? Co jezeli typow bedziesz miec 10? To juz lepiej napisac genericsa do tego...
T9
chciałem do pisać w edycji że smierdzi i problem pewnie lezy wyzej gdzieś ale dostałem powiadomienie w trakcie pisania:)
T9
bo jak on chce żeby naraz mu się odpalały automatycznie te same metody z rożnymi sygnaturami, to tak się raczej nie da zrobić czysto w jezyku silnie typowanym, polimorfizmem też tego nie załatwi bo sygnatury są różne. Jak one są static to raczej nie zależą od żadnego stanu i powinien zacząć od wywalenia ich do osobnej klasy, zwłaszcza że to wnioskując po nazwie rożne wersje tej samej metody. Generalnie uważam że wcześniej brakuje jakieś abstrakcji dlatego musi ręcznie wywoływać te metody.
fasadin
oczywiscie ze sie da. Generics sam w sobie by wystarczyl
T9
jeśli metody z różnych klass maja takie same sygnatury? pisanie genClass.do<class1,int>(liczba), genClass.do<class2,int(liczba2), jest gorsze od class1.do(liczba) class2.do(liczba); Poza tym trzeba zakładać ze użytkownik ie wpisze nie obsługiwanego typu, i tracisz pomoc z intiliSense. Działać będzie działać ale czysto nie będzie.
AreQrm
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Londyn
  • Postów:873
1

A co z argumentami dla metod? Zawsze mają być takie same? Jeśli tak to po co argumenty. Zakładam więc że tak nie jest.
Czemu chcesz wywoływać je na raz? Jakaś transakcja? Czy zbierasz od użytkownika najpierw rzeczy które chcesz potem zrobić? Jak to wygląda "wyżej"? Dlaczego używasz statycznych klas? Może całe rozwiązanie jakie próbujesz zrobić jest nieobiektowe i w tym leży problem?


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.