Kiedy spotykam się z takim pytaniem, zazwyczaj myślę o trzech podstawowych pytaniach.
- Co jest bardziej czytelne?
- Co pozwala na lepsze ponowne wykorzystanie kodu?
- Co jest bardziej wydajne?
Niekoniecznie w tej kolejności, ponieważ zależy to od scenariusza, ale uważam, że w tym przypadku wszystkie trzy z tych pytań są na korzyść opcji B. Jeśli kiedykolwiek musiałeś zmodyfikować opcje dla funkcji createClient, będziesz musiał je edytować w każdym pliku który z niego korzysta. Który w opcji A to każdy plik, który używa redis, a opcja B to po prostu redis.js. Również, jeśli pojawi się nowszy lub inny produkt i chcesz zastąpić redis. Byłoby wykonalne, aby redis.js był opakowaniem dla innego pakietu lub nawet nowszego klienta redis, znacznie skracając czas konwersji.
Globalne są generalnie złe, ale w tym przykładzie redis.js nie powinien przechowywać mutable state, więc nie ma problemu z globalnym/singletonem w tym kontekście.