一般來說,奉行 SRP 確實容易讓程式碼變成很多個小檔案,但沒有絕對的關係,例如 String.java
也是個上千行的大怪物,不過整體來說卻是符合 SRP,因為多數的函式都是 String
物件該有的。
很多小檔案對理解專案是好還是不好,這很難說,要看個人的背景,有人喜歡所有東西都在一個檔案中。對我來說,要我在一個兩、三千行的檔案裡找東西,或是看懂這樣一個檔案,那才是痛苦不堪。
SRP 理論上可以讓每個元件 (檔案) 很容易理解,如果不是,那應該是抽象做錯了。SRP 的重點是該物件是否只做它自己該做的事。
Singleton 確實是 global variable,但有一點跟過去傳統會造成 side effect 的 global variable 不同,Singleton 是受保護的實體,一旦初始化後,沒有其他人可以換掉該實體 (若實體是個物件,有 setter 可以改變其內部狀態不在此討論範圍內)。
所有的 pattern 適用與否取決於你的 intent,若你想要一個「全域就只能有一個實體」的設計,那就應該使用 Singleton,若你只是想要一個方便的 accessor,那使用 Singleton 恐怕就不是一個好設計。
我不會刻意避免使用 Singleton,但我的 domain model 中很少會出現 Singleton,因為沒有這樣的 intent。但 application layer 或是使用到 framework 時,我就很難說都沒用到 Singleton。
我不確定你的背景,但如果你有用過 Spring framework,我相信你一定用過 @Bean
或是 @Autowired
,出個小作業,被 @Bean
標示的物件,在整個應用的生命週期中,有幾個實體?
不好意思隔了很久才回,希望我的答覆有幫助到你。