Wpadł mi do głowy pewien pomysł, i zastanawiam się czy ktoś już kiedyś wpadł na taki pomysł, i czy to zostało już nazwane.
Otóż chodzi o to, że sporo aplikacji wykorzystystuje niektóre dane niejawnie. Chodzi o to że wołamy jakąś funkcję, i z jej sygnatury nie wynika w żaden sposób że ona czegoś używa. Może to być:
- pola statyczne jakiejś klasy
- zmienne globalne (co w sumie koncepcyjnie jest tożsame z polami statyczynmi)
- jakieś elementy systemu operacyjnego, jak locale, czas, ip, hostname, etc.
- elementy runtime'u, jak cwd, argv, zmienne środowiskowe
Chciałbym napisać aplikację w taki sposób, żeby żadna klasa ani funkcja nie brała takich rzeczy niejawnie - tzn. żeby wszystko było przekazane przez parametry w dół, a jeśli coś musi odczytać systemowy element, to powinna to być jakaś klasa, tylko po to, jak np SystemTime
, której instancje tez się przekazuje "z góry na dół" przez parametry. Myślę że jest to jaknajbardziej wykonalne.
W takim paradygmacie:
- używanie elementów systemowych byłoby dozwolone tylko jeśli ten dostęp jest w implementacji polimorficznej, (np funkcji albo instancji klasy), którą można przekazać przez parametry "z góry".
- używanie elementów z runtimeu byłoby dozwolone tylko w
main()
, i należałoby je w pakować w polimorficzne elementy (jak funkcje i klasy), i przekazanie ich dalej parametrami - dostęp do pól statycznych byłby dozwolony tylko w obrębie jednej klasy, w taki sposób żeby jej zachowanie nigdy nie wpłynęło na różne instancje tej klasy (czyli mogłyby być użyte tylko np do optymalizacji),
- no a zmienne globalne, to wiadomo, zawsze zakazane (w tym paradygmacie).
Taki paradygmat też trochę niewewlowałby potrzebę takich rozwiązań jak kontenery DI, bo jeśli wszystko jest przekazywane "z góry na dół" przez parametry, to żadne "wspomagacze wstrzykiwania zal." nie są potrzebne.
I tak się zastanawiam, czy takie podejście - które można by nazwać paradygmatem, bo jest to jakiś nałożony constraint, (tak samo jak programowanie strukturalne np) czy on jest już jakoś nazwany, słyszał ktoś o czymś takim?
I tak, rozumiem że ten pomysł, lokalnie możnaby nazwać że to jest właściwie to samo co "Dependency Injection". Tylko dwie rzeczy: po pierwsze DI się odnosi do wstrzykiwania rzeczy przez konstruktor, a ja tutaj opisuje case w którym to nie musi być konstruktor tylko dowolny parametr. A po drugie, nie jestem pewien czy "Dependency Injection" nie odnosi się tylko do małych miejsc (np klasa), a nie do całej aplikacji. Czy jak powiem "Moja aplikacja opiera się na Dependency Injection", to czy na tej podstawie ktoś by się domyślił że każdy jeden element, dana czy call jest przekazany przez parametry z góry na dół?