Kilka klientów na jednym kodzie - jak to rozwiązać?

Kilka klientów na jednym kodzie - jak to rozwiązać?
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
0

Opis problemu:
Klienci: A, B, C
Branche w repo: główny, branch_a, branch_b, branch_c

Aktualnie to wygląda w ten sposób, że jest jeden główny branch plus branch A, B i C. Branch główny to taka trochę klasa abstrakcyjna, bo wchodzi tam wszystko co ma wejść na instancje A, B oraz C. W momencie aktualizacji główny branch jest domergowywany do pozostałych. Zmiany, które są tylko dla klienta A wchodzą tylko na branch_a itd.

Jakie rozwiązania widzę:
Rozwiązanie, które jest w zgodzie z myśleniem Janusza, czyli zostawiamy kod dalej na tym samym repo (a nie robimy oddzielnie dla każdego klienta) spowoduje jedno z dwóch:
a) Pierdyliard ifów w kodzie (teraz dwa, a w przyszłości dwa tysiące)
b) Można wczytywanie odpowiednich widoków zamieść głęboko pod dywan, żeby uniknąć ifów i sprawdać klienta tylko raz podczas bootstrapa aplikacji, ale wtedy dla każdej z instancji musiałby być tworzony osobny widok, bo przecież wszystko stoi na jednym kodzie - FUCK DRY.

Pomijam fakt związany np. z optymalizacją zapytań, bo jeżeli jeden klient będzie chciał widzieć 2 kolumny, a drugi 20 to tak czy siak będzie tam trzeba albo załatować wszystkie potrzebne dane, albo kolejne ify?

Mi się osobiście wydaje, że rozdzielenie tego, tak żeby każdy klient miał swój osobny kod (a nie wszystko razem) jest najbardziej sensowne, ale moje doświadczenie jest zbyt małe, żeby to stwierdzić.

Co myślicie?

edytowany 6x, ostatnio: Desu
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
3

ja mysle, ze mozna to rozwizac inaczej. To rozwiazanie ktore macie juz wlasnie wam sprawia problemy (osobne repo pod klienta a pozniej mergowanie do kilku branchy tej samej funkcjonalnosci...)

Kod wspolny dla wszystkich klientow. Dokladnie taki sam.
Dodac osobny plik dla klienta (jakis plik konfiguracyjny). Jak zabezpieczyc to pomijam (bo to nie o tym). Przy starcie aplikacji (ktora niech posiada wszystkie feature. Nawet te ktore chce tylko klient A... bo przeciez chyba nie szkoda Wam miejsca na dysku?) niech czyta z pliku konfiguracyjnego co ma wlaczyc a co ma wylaczyc (w sensie co ma zainicjalizowac jako nowy obiekt).

Takie rozwiazanie nie jest idealne, ale na pewno lepsze od tego co bedziecie miec teraz. Co trzeba zrobic to

  • Dokumentowac co sluzy do czego przy parsowaniu pliku
  • Jeden feature -> Jedna klasa (jakas abstrakcyjna glowna).
  • Jakis Container na abstrakcyjne klasy ktore sa jakims featurem.

Do tego mozna napisac jakis prosty tool ktory generuje taki plik. Wiec jak bedzie kolejny klient to sobie bedziecie mogli wlaczyc/wylaczyc co tylko chcecie.

Wada tego rozwiazania jest utrzymywanie tych plikow konfiguracyjnych. Jezeli w firmie zabraniknie kogos kto ogarnia ten temat i nie bedzie dokumentacji to bedzie to dosc ciezkie do utrzymania (ale to mozna zwiekszyc za pomoca unit testow, integracyjnych testow etc)

Ale takie rozwiazanie zapewne wymaga u Was przebudowania calego kodu... wiec zapewne nie wchodzi w gre ;) Jezeli tak jest to daj znac. Pomysli sie nad czyms innym

edytowany 2x, ostatnio: fasadin
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

@Desu ja bym jednak szedł jeszcze głębiej w generalizacje tego kodu zamiast w zrobienie kilku osobnych codebasów. Dlaczego:

  1. Kilka codebasów = problem kiedy chcesz wprowadzić fixy we wszystkich wersjach
  2. Problem kiedy nagle jeden klient będzie chciał coś co ma juz drugi klient. Będziesz musiał sie bawić w ekstrakcje i mergowanie
  3. To co wyżej ale lvl hard -> nowy klient który chce po trochu z funkcji które maja inni klienci = powodzenia z ekstrakcją i składaniem tego :D

Dużo lepiej i wygodniej jest zrobić jedne generalny codebase ze wszystkimi opcjami i dać możliwość włączenia lub wyłączenia ich z poziomu jakiegoś panelu konfiguracyjnego. Przy odpowiedniej architekturze można wykorzystać kontener IoC do złozenia aplikacji bez konieczności wprowadzania ifów w kodzie.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
fasadin
czyli dobrze mysle :)
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
0

Dzięki Panowie za odpowiedzi. Jakoś sobie spróbuję z tym poradzić. Powiedzcie mi jeszcze jak taką sytuację się rozwiązuje wcześniej niż w momencie gdy już wszystko się wali?

Jeżeli wiem, że mam produkt, który będę sprzedawał powiedzmy 5 klientom to jak to jest rozwiązywane "po bożemu" na etapie projetowania aplikacji?

edytowany 1x, ostatnio: Desu
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Jeden mocno konfigurowalny projekt (np. z jakimś key-value store albo bazą danych z parametrami konfiguracyjnymi, gdzie masz np. dialogi i labelki oraz informacje na temat konfiguracji komponentów), często z możliwością dodawania dynamicznych pluginów.
Dzieki temu klient ma swoja konfiguracje a do tego jeśli potrzebuje jakiegoś mega customowego rozwiązania to tworzy sie na to osobny plugin.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
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)