漫談面向對象與日常開發(fā)

記得第一次跳槽的時候凝危,到招聘網(wǎng)站上翻看各種初級工程師的招聘要求波俄,都會有意無意的加上一句:具有良好的面向對象思維。當時心里很不屑蛾默,面向對象無非就是"繼承懦铺,多態(tài),封裝"嘛支鸡。直到工作了很多年之后冬念,看了很多書之后,越來越覺得當時的想法有點low了牧挣,剛好前一段時間和朋友聊到日常開發(fā)中有些設計的優(yōu)劣急前,有些心得,想把它記錄下來瀑构,遂有此文裆针。

面試別人的時候,我偶爾會問一個問題:請用一句話來描述何為restful寺晌。對于這個問題据块,面試者答得各式各樣,其實在我心里的答案就是:restful就是用路徑定位資源折剃,用get/post/put/delete操作資源。說白了像屋,restful最核心的概念并不是url樣式或者get/post方法而是資源怕犁。何為資源?這個就是你的應用上的領域對象了己莺。在互聯(lián)網(wǎng)企業(yè)中奏甫,現(xiàn)在很少有人再用hibernate/jpa了,其實熟悉jpa的人對restful有一種天生的親近感凌受,它們天然的描述了對象之間的關系阵子,可以這樣說,restful是面向對象思想在api設計上的一種體現(xiàn)胜蛉,所以風格自由挠进,兼容性更好,觀之就能理解業(yè)務對象之間的關系誊册。很多人推崇的代碼即文檔领突,不過如是。

即便我對hibernate如此推崇案怯,也只是相對日常開發(fā)中最常用的mybatis來講的君旦,在更極致的面向對象設計理念中,hibernate所代表的設計風格,只是一種貧血設計模型金砍。因為萬事萬物局蚀,不可能只有狀態(tài)而沒有行為,通俗來講恕稠,就是不可能只有屬性琅绅,而沒有方法(get/set不算)。舉一個簡單的例子

public class Person{
  int age;// 年齡
  String name; // 姓名
  String idCard; // 身份證號
  GENDERS gender; // 性別
  Person partner; // 伴侶
  enum GENDERS{
    MALE,FEMALE;
  }
  // 和某人結婚
  void marriadWith(Person somebody){
    if(this.gender.equals(somebody.gender)){
      throw new IllegalStateException("不能和同性結婚")
    }
    if(this.age<18 || somebody.age<18){
      throw new IllegalStateException("未成年人不能結婚") 
    }
    this.partner=somebody;
    somebody.partner=this;
  }
}

如上所示谱俭,這才是一個完整體現(xiàn)了面向對象思想的代碼設計奉件。可能從事企業(yè)開發(fā)的朋友們對這種寫法會嗤之以鼻昆著,因為——這個例子沒有數(shù)據(jù)庫操作县貌。

誠然,因為我們沒有無限的內存凑懂,導致我們業(yè)務對象的生命周期的大部分時間都是以另一種形態(tài)靜靜躺在數(shù)據(jù)庫中煤痕,而且由于數(shù)據(jù)庫的各種設計特性,會割裂我們最接近現(xiàn)實的設計接谨。比如上面的例子摆碉,在數(shù)據(jù)庫里面存的可能是

create table t_person(
age int,
name varchar(64),
id_card varchar(32),
gender smallint,
partner_id_card varchar(32),
primary key id_card
)

很多朋友喜歡先設計數(shù)據(jù)庫,然后通過mybatis官方提供的generator反向生成對應的業(yè)務實體脓豪,但是很不幸巷帝,大多數(shù)互聯(lián)網(wǎng)公司都是禁止使用外鍵的,這就導致了我們的業(yè)務實體成了下面的樣子

public class Person{ 
    int age;// 年齡
  String name; // 姓名
  String idCard; // 身份證號
  int gender; // 性別
  String partnerIdCard; // 伴侶
}

好了扫夜,我們辛辛苦苦挖出來的領域知識被消磨殆盡了楞泼。

這就是我為什么如此厭惡mybatis和generator了。我厭惡的并不是這兩項技術笤闯,而是厭惡的這種設計方式湮滅了我們的領域知識堕阔,讓我們進一步學習業(yè)務領域,改進設計方案的可能無限趨近于零了颗味。

在這里超陆,我再次鄭重推薦一種設計方法,就是架構師們常常掛在嘴邊的DDD浦马,全稱是領域驅動設計时呀,我稱之為面向對象思想在企業(yè)開發(fā)中的落地方案。這篇文章不是專門介紹ddd的晶默,就不詳細介紹了退唠。

面向對象的"繼承,多態(tài)荤胁,封裝"三大特征里面瞧预,只要熟練使用設計模式基本上對繼承和多態(tài)就能有足夠的認識了屎债,但是"封裝"這兩個字,卻沒那么容易垢油,很多設計上的缺陷就是由"封裝"認識不足引發(fā)的盆驹。

在Java企業(yè)開發(fā)工作中,很多項目都會按照controller/entity/service/dao這樣的職責進行代碼的劃分滩愁,好像這樣就做到了"分層"躯喇。剛工作的時候硝枉,我也是這種劃分方式的擁躉,到后來越來越覺得這種劃分方式不科學妻味。首先,并不是所有的代碼調用都會從controller到dao责球,也不是所有的controller都會以來entity焦履,按照這種劃分方式寫,猶如八股文一樣繁瑣并且又臭又長雏逾。再者,被分在同一個包中的controller很少有互相調用栖博,dao更不會互相調用,相反仇让,被分在不同的模塊中的XXXController常常會依賴XXXEntity侨把,再通過XXXService調用XXXDao簡直就像呼吸一樣頻繁,這就形成了不同模塊之間的高耦合相同模塊之間的低內聚妹孙,也不能遵循相同模塊共同發(fā)布的原則,簡直就是一個大泥團获枝。這是對面向對象思想的封裝思想嚴重的認識不足,這種情況高級程序員乃至很多架構師亦不能免俗省店,大概是習慣使然吧。

最近在讀一本小說雹舀,小說中把"道"和"術"分別比喻成路和腳粗俱。誠然说榆,如果沒有技術我們就沒法去開發(fā),但是如果沒有設計思想签财,就會我們迷失方向,最終導致我們的代碼一團亂麻邦鲫,甚至會導致項目失敗神汹。在我們日常開發(fā)中 ,我們心里應該有一條準繩屁魏,什么樣的技術可以用,以及技術如何使用都應該在心里過一遍蚁堤。做程序員的固然要不斷學習,但世上技術千千萬撬即,我們只需要學有用的就夠了呈队,什么樣的技術有用剥槐,一旦心里有一條準繩宪摧,自然會知道。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蕊苗,一起剝皮案震驚了整個濱河市沿彭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喉刘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造锅,死亡現(xiàn)場離奇詭異廉邑,居然都是意外死亡倒谷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門恨锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倍靡,“玉大人,你說我怎么就攤上這事他挎。” “怎么了办桨?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵站辉,是天一觀的道長。 經(jīng)常有香客問我殊霞,道長,這世上最難降的妖魔是什么绷蹲? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任顾孽,我火速辦了婚禮,結果婚禮上若厚,老公的妹妹穿的比我還像新娘。我一直安慰自己疤估,他們只是感情好乞封,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布岗憋。 她就那樣靜靜地躺著,像睡著了一般仔戈。 火紅的嫁衣襯著肌膚如雪拧廊。 梳的紋絲不亂的頭發(fā)上晋修,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音墓卦,去河邊找鬼。 笑死睁本,一個胖子當著我的面吹牛忠怖,可吹牛的內容都是我干的。 我是一名探鬼主播凡泣,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骂维!你這毒婦竟也來了严卖?” 一聲冷哼從身側響起席舍,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤来颤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后福铅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项阴,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年略荡,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉胶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡通今,死狀恐怖肛根,靈堂內的尸體忽然破棺而出漏策,到底是詐尸還是另有隱情,我是刑警寧澤掺喻,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站喉脖,受9級特大地震影響抑月,放射性物質發(fā)生泄漏树叽。R本人自食惡果不足惜谦絮,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望性锭。 院中可真熱鬧叫胖,春花似錦草冈、人聲如沸瓮增。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸捏。三九已至谬运,卻和暖如春垦藏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掂骏。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滑废。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓蠕趁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俺陋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容

  • 在一個方法內部定義的變量都存儲在棧中,當這個函數(shù)運行結束后苔可,其對應的棧就會被回收,此時焚辅,在其方法體中定義的變量將不...
    Y了個J閱讀 4,420評論 1 14
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,113評論 1 32
  • 1.JVM 堆內存和非堆內存 堆和非堆內存按照官方的說法:“Java 虛擬機具有一個堆(Heap)同蜻,堆是運行時數(shù)據(jù)...
    yanzhu728閱讀 919評論 0 0
  • 1.Struts2.0有幾種標簽庫 【參考答案】 UI標簽、控制標簽亏掀、數(shù)據(jù)標簽、雜項標簽 2.struts2必備包...
    碼記閱讀 1,605評論 0 7
  • 夜色降臨 仰望著那輪朦朧的明月 依稀發(fā)現(xiàn)你那曼妙的身影 在明月里優(yōu)雅的跳動著 仿佛 跳到我那熱情的心間 跳著跳著跳...
    槽點仿談閱讀 99評論 0 2