架構,改善程序(xu)復用(yong)性(xing)的設計~第五講 復用(yong)離不開反(fan)射(she)和IOC續(xu)(大白話IOC)
要研究(jiu)的問題:IOC是什(shen)么(me)?它解決了什(shen)么(me)?我(wo)們的項目中為何要用IOC?反(fan)射對性能真(zhen)的影響很(hen)大嗎?不(bu)用反(fan)射,誰意見(jian)最(zui)大?
來吧,開始說問題
1,IOC是什么?不用(yong)說什么容(rong)器,框架,大白話其實IOC就是將一些接口(kou)與它的各種(zhong)實現(xian)的類名(ming)配置在(zai)一個(ge)文(wen)件中(zhong),可以(yi)是XML,也可以(yi)是.config配置文(wen)件中(zhong),然(ran)后(hou)(hou)在(zai)程(cheng)序(xu)“運行(xing)時”去根據配置的信(xin)息(xi)去動態得到(resolved)這個(ge)對象,然(ran)后(hou)(hou)程(cheng)序(xu)中(zhong)就可以(yi)使用(yong)這個(ge)對象了,所IOC就是用(yong)來建立對象的。
2,它(ta)解決了什么?一個接口,有三種(zhong)實現,如(ru)sql實現,oracle實現,access實現等,那(nei)當(dang)前(qian)環境下用哪種(zhong)方式來(lai)進行實現呢,這時可以由IOC來(lai)實現它(ta)。
1 // 統(tong)一(yi)規范 2 public interface IRepository<TEntity> where TEntity : class 3 { 4 void Insert(TEntity entity); 5 } 6 7 // sql 實(shi)現 8 public class SqlRepository<TEntity> : IRepository<TEntity> 9 { 10 public void Insert(TEntity entity) 11 { 12 ... 13 } 14 } 15 16 // Access實現 17 public class AccessRepository<TEntity> : IRepository<TEntity> 18 { 19 public void Insert(TEntity entity) 20 { 21 ... 22 } 23 }
3,我(wo)們的項目(mu)中為(wei)何(he)要用(yong)IOC?在項目(mu)中用(yong)IOC的目(mu)的很簡單,就是(shi)讓(rang)程序松耦合,說的有點抽象(xiang),看一個小代碼(ma)
1 class UserService 2 { 3 var userRepository=new UserRepository(); 4 }
我們可以看到userRepository對象它依賴于UserRepository的實現,當(dang)我們(men)需要改變userRepository的實現方法時(shi),很(hen)困難,只能去代(dai)碼(ma)中(zhong)改變,這樣導(dao)致程序的擴展(zhan)性很(hen)低,這是項目中(zhong)引入IOC的原(yuan)因,也就是說:“當(dang)程序模塊有(you)多種(zhong)實現方式(shi)時(shi),可以引用IOC方式(shi)來創建對(dui)象的實例”。
4,反射(she)(she)對(dui)(dui)性能真的影響很(hen)大(da)嗎(ma)?這個問題(ti)有無數(shu)個人(ren)做了(le)無數(shu)次(ci)實(shi)驗,反射(she)(she)和不用反射(she)(she)的程序,差距不好確定(ding),因為它與數(shu)據(ju)(ju)復(fu)雜度還有關系,一般數(shu)據(ju)(ju)量(liang)小時,可(ke)能幾十(shi)倍,數(shu)據(ju)(ju)量(liang)時,可(ke)能上(shang)百倍(反射(she)(she)在底層實(shi)現(xian)時),我(wo)們(men)可(ke)以從微軟的原碼中看到,它在一些時候(hou)使用了(le)很(hen)多反射(she)(she),是(shi)(shi)的,我(wo)本人(ren)不反對(dui)(dui)使用反射(she)(she),因為我(wo)是(shi)(shi)一個面向(xiang)對(dui)(dui)象(xiang)的忠實(shi)信仰(yang)者。
5,不(bu)用反射(she),誰意(yi)見最(zui)大(da)?這個(ge)(ge)問題很(hen)有(you)意(yi)思,誰意(yi)見最(zui)大(da)?我(wo)看(kan)因為是(shi)“面向(xiang)對(dui)(dui)象(xiang)”意(yi)見最(zui)大(da),因為我(wo)們(men)無法去想像一個(ge)(ge)沒有(you)反射(she)的(de)(de)程序是(shi)如(ru)何面向(xiang)對(dui)(dui)象(xiang)的(de)(de),當一個(ge)(ge)需求被更(geng)改時,就要去修改你的(de)(de)程序代碼,這對(dui)(dui)于程序員是(shi)一種痛(tong)苦(ku),也違背(bei)了面向(xiang)對(dui)(dui)象(xiang)的(de)(de)原則,我(wo)想,即然(ran)C#是(shi)一個(ge)(ge)完(wan)全面向(xiang)對(dui)(dui)象(xiang)的(de)(de)語言,那我(wo)們(men)在寫程序時,是(shi)否應該面向(xiang)對(dui)(dui)象(xiang)更(geng)多一些,而(er)不(bu)是(shi)那么一點(dian)點(dian)的(de)(de)性(xing)能(neng),而(er)且這種性(xing)能(neng)的(de)(de)浪費我(wo)認為是(shi)完(wan)成值得的(de)(de)。
信仰C#,信仰面向對(dui)象
感謝各位!