Naprawdę potrzebuję uczciwej, przemyślanej debaty na temat zalet obecnie przyjętego paradygmatu projektowania aplikacji korporacyjnych .
Nie jestem przekonany, że obiekty bytów powinny istnieć.
Przez obiekty encji mam na myśli typowe rzeczy, które zwykle tworzymy dla naszych aplikacji, takie jak „Osoba”, „Konto”, „Zamówienie” itp.
Moja obecna filozofia projektowania jest następująca:
- Cały dostęp do bazy danych musi być realizowany za pośrednictwem procedur składowanych.
- Zawsze, gdy potrzebujesz danych, wywołaj procedurę składowaną i wykonaj iterację po SqlDataReader lub wierszach w DataTable
(Uwaga: stworzyłem również aplikacje korporacyjne w Javie EE, ludzie java proszę zastąpić równoważnik dla moich przykładów .NET)
Nie jestem anty-OO. Piszę wiele zajęć do różnych celów, ale nie do jednostek. Przyznam, że spora część klas, które piszę, to statyczne klasy pomocnicze.
Nie buduję zabawek. Mówię o dużych aplikacjach transakcyjnych o dużej objętości, wdrażanych na wielu komputerach. Aplikacje internetowe, usługi Windows, usługi internetowe, interakcja b2b, możesz to nazwać.
Użyłem OR Mappers. Napisałem kilka. Użyłem stosu Java EE, CSLA i kilku innych odpowiedników. Nie tylko z nich korzystałem, ale aktywnie rozwijałem i utrzymywałem te aplikacje w środowiskach produkcyjnych.
Doszedłem do sprawdzonego w walce wniosku, że obiekty istot wchodzą nam w drogę i bez nich nasze życie byłoby o wiele łatwiejsze.
Rozważmy ten prosty przykład: otrzymujesz telefon do pomocy technicznej dotyczący pewnej strony w aplikacji, która nie działa poprawnie, być może jedno z pól nie jest utrwalane tak, jak powinno. W moim modelu programista wyznaczony do znalezienia problemu otwiera dokładnie 3 pliki . ASPX, ASPX.CS i plik SQL z procedurą składowaną. Rozwiązanie problemu, który może być brakującym parametrem wywołania procedury składowanej, zajmuje kilka minut. Ale w przypadku dowolnego modelu jednostki niezmiennie uruchomisz debuger, zaczniesz przechodzić przez kod i możesz skończyć z 15-20 plikami otwartymi w programie Visual Studio. Kiedy zszedłeś na sam dół stosu, zapomniałeś, od czego zacząłeś. Możemy trzymać w głowie tylko tyle rzeczy naraz. Oprogramowanie jest niesamowicie złożone bez dodawania niepotrzebnych warstw.
Złożoność programowania i rozwiązywanie problemów to tylko jedna strona mojego problemu.
Porozmawiajmy teraz o skalowalności.
Czy programiści zdają sobie sprawę, że za każdym razem, gdy piszą lub modyfikują dowolny kod, który współdziała z bazą danych, muszą przeprowadzić dogłębną analizę dokładnego wpływu na bazę danych? I to nie tylko kopia programistyczna, mam na myśli naśladownictwo produkcji, więc możesz zobaczyć, że dodatkowa kolumna, której teraz potrzebujesz dla swojego obiektu, właśnie unieważniła bieżący plan zapytań, a raport, który był uruchomiony w 1 sekundę, zajmie teraz 2 minuty, tylko ponieważ dodałeś jedną kolumnę do listy wyboru? I okazuje się, że indeks, którego teraz potrzebujesz, jest tak duży, że DBA będzie musiał zmodyfikować fizyczny układ twoich plików?
Jeśli pozwolisz ludziom oddalić się zbytnio od fizycznego magazynu danych z abstrakcją, sieją spustoszenie w aplikacji, która wymaga skalowania.
Nie jestem fanatykiem. Mogę być przekonany, że się mylę, a może jestem, ponieważ jest tak silny nacisk na Linq do Sql, ADO.NET EF, Hibernate, Java EE itp. Proszę przemyśleć swoje odpowiedzi, jeśli czegoś mi brakuje. naprawdę chcę wiedzieć, co to jest i dlaczego powinienem zmienić sposób myślenia.
[Edytować]
Wygląda na to, że to pytanie nagle znów się uaktywniło, więc teraz, gdy mamy nową funkcję komentowania, skomentowałem bezpośrednio kilka odpowiedzi. Dzięki za odpowiedzi, myślę, że to zdrowa dyskusja.
Powinienem był chyba wyraźniej powiedzieć, że mówię o aplikacjach korporacyjnych. Naprawdę nie mogę komentować, powiedzmy, gry działającej na czyimś komputerze stacjonarnym lub aplikacji mobilnej.
Jedna rzecz, którą muszę tutaj umieścić na górze w odpowiedzi na kilka podobnych odpowiedzi: ortogonalność i oddzielenie obaw często są wymieniane jako powody, dla których warto przejść na podmiot / ORM. Procedury składowane są dla mnie najlepszym przykładem rozdzielenia problemów, jakie przychodzą mi do głowy. Jeśli nie zezwolisz na dostęp do bazy danych w inny sposób niż za pośrednictwem procedur składowanych, możesz teoretycznie przeprojektować cały model danych i nie złamać żadnego kodu, o ile zachowasz dane wejściowe i wyjściowe procedur składowanych. Są doskonałym przykładem programowania na podstawie kontraktu (pod warunkiem, że unikasz „select *” i dokumentujesz zestawy wyników).
Zapytaj kogoś, kto jest w branży od dawna i pracował z długotrwałymi aplikacjami: ile warstw aplikacji i interfejsu użytkownika pojawiło się i zniknęło, gdy baza danych żyła? Jak trudne jest dostrojenie i refaktoryzacja bazy danych, gdy istnieje 4 lub 5 różnych warstw trwałości generujących kod SQL w celu uzyskania danych? Nie możesz niczego zmienić! ORMy lub dowolny kod, który generuje SQL, blokuje bazę danych w kamieniu .