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:4 miesiące
  • Lokalizacja:Podkarpacie
  • Postów:448
0
fasadin
a po co mu revertowanie komend ;>?
fasadin
  • Rejestracja:ponad 13 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:dzień
  • 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:prawie 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:prawie 11 lat
  • Ostatnio:27 dni
  • 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?


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)