@zergeling: nie do końca musisz robić te switche. Wszystko załatwiasz plikiem konfiguracyjnym i interfejsami. Nie musisz mieć nawet jednego if'a. No może jeden, który sprawdza dla kogo działa apka i wczytuje odpowiedni plik konfiguracyjny.
Załóżmy, że masz jakiś moduł e-commerce. Masz klasę, która zajmuje się liczeniem ceny zamówienia. Możesz mieć w niej metodę calculate
. Metoda ta w podstawowej wersji sumuje ceny produktów * quantity. Teraz powiedzmy, że klient A ma jakieś reguły zniżkowe. Klient B też, ale są one całkowicie inne. Reguł może być 500. Ty chcesz stworzyć klasę PriceCalculatorWithDiscount, PriceCalculatorWithDiscountForCustomerA, PriceCalculatorWithDiscountForCustomerB... itd. i w każdej "delikatnie nadpisać" działanie metody calculate
.
Bez sensu. Lepiej jest każdą regułę wydzielić do osobnej klasy. Teraz w pliku konfiguracyjnym dla klienta A definiujesz reguły, które będą wstrzyknięte do Twojej klasy i tyle. W runtimie symfony czy inny framework załatwia wszystko za Ciebie. Patrzy dla jakiego klienta działa apka i buduje Ci te twoje obiekty, tak jak masz w konfiguracji.
Dlatego zazwyczaj jak się ma jeden produkt, to nie słucha się każdego pierdnięcia klienta, bo powstaje Ci miliard ficzerów specjalnie pod klienta, a to generuje mnóstwo problemów. No chyba, że klient bardzo dużo płaci.. to wtedy można.
Możesz też stworzyć core aplikacji i jak któryś chce coś turbo customowego, to budujesz aplikację pod niego wychodząc z core'a. Jak jakiś ficzer, który sobie zażyczy wydaje się fajny i w miarę uniwersalny, to dopiero wrzucasz do core'a.
TD;DR;
Nie podamy Ci dobrego rozwiązania Twojego problemu bez bardzo dokładnego wejścia w jego domenę i biznes. Ogólnikowo to strategie.. fabryki.. AOP.. plug-In architecture.
Możesz też spróbować zobaczyć jak ogarnął to wordpress albo presta lub magento.