自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

寫好軟件的訣竅

開發(fā) 前端 后端
事實上,計算機并不去閱讀你在程序里寫了什么,而人會。計算機把程序員寫的代碼編譯成字節(jié)比特,真正會去看你寫的是什么的只有人類。

[[72114]]

 

真實情況

真實情況是,計算機能正確的按照命令去運行。無論你寫的是“Hello World”,還是用無人飛機去殺死一個人。計算機都能精確的按照你的命令去做。

可我們的工作,我們的真正工作是:告訴程序員和我們自己:我們讓計算機做什么了。現(xiàn)代的軟件編程思想就是結(jié)構(gòu)化的、清楚的描述計算機將要執(zhí)行的任務(wù)。

事實上,計算機并不去閱讀你在程序里寫了什么,而人會。計算機把程序員寫的代碼編譯成字節(jié)比特,真正會去看你寫的是什么的只有人類。

寫軟件要像講故事

如果你對你的工作和你寫的代碼的行為有了新的認識,你會馬上很清楚的發(fā)現(xiàn),編程工作更像講故事。

想一想。你是如何知道一個人講故事沒人愛聽的?這很簡單,他老跑題,他老是糾結(jié)在不重要的細節(jié)上,他老是在故事場景中挑來跳去,等等。你立刻能知道故事被他講爛了。

雖然在***你能明白故事里發(fā)生了什么,你甚至能復(fù)述它,但你會喜歡這樣的故事嗎?你會有興趣轉(zhuǎn)述給別人或豐富故事內(nèi)容嗎?

相同的事情也發(fā)生在軟件開發(fā)中。如果你的代碼寫的含糊不清,亂七八糟,沒有人會愿意欣賞它。沒有人會愿意看它第二次。并且你是***個受它折磨的人。

訣竅

那么,現(xiàn)在你想要知道這個簡單的秘訣,不是嗎?下面就是代碼里的干擾因素越少越好

注意,我不是在討論明晰的代碼vs隱晦的代碼,不是在討論約定優(yōu)先,不是在討論元數(shù)據(jù)編程有害或其它類似的東西。

寫出好的軟件的訣竅是代碼里只寫那些能讓你的代碼講出的故事更有意義的內(nèi)容。如果它能讓你的代碼更清楚,那就這樣寫它。如果這個東西對故事沒有任何意義,那就扔了它。扔了它能讓故事更好。如果代碼耦合模塊不清,就用元數(shù)據(jù)編程和約定。

例子

有一些經(jīng)典的例子可以證明這一點。比如,描述一篇帖子和它的作者的關(guān)系。

  1. class Post < ActiveRecord::Base  
  2.   belongs_to :author, class_name: 'User', foreign_key: :authored_by  
  3. end 

看見了沒?所有關(guān)于類名,外鍵的信息都是干擾。去掉它們。

  1. class Post < ActiveRecord::Base  
  2.   belongs_to :user  
  3. end 

第二版中沒有好聽的“作者”字眼,但卻是更優(yōu)的,因為它直奔主題,用最簡短的語句告訴所有你想知道的。

另外一個例子,說一個類需要關(guān)聯(lián)那些創(chuàng)建/修改它的信息的用戶

  1. class Setting < ActiveRecord::Base  
  2.   belongs_to :creator  
  3.   belongs_to :editor  
  4.  
  5.   attr_accessor :editing_user  
  6.  
  7.   before_create :set_creator  
  8.   before_update :set_editor  
  9.  
  10. private 
  11.  
  12.   def set_creator  
  13.     self.creator = @editing_user  
  14.   end  
  15.  
  16.   def set_editor  
  17.     self.editor = @editing_user  
  18.   end  
  19.  
  20. end 

干擾,所有的這些回調(diào)和attr_acessors都是干擾,都是垃圾信息,沒有任何價值體現(xiàn)在你想完成的任務(wù)中。更簡潔更好的方法是下面這樣寫:

  1. class Setting < ActiveRecord::Base  
  2.   belongs_to :creator  
  3.   belongs_to :editor  
  4.  
  5.   def editing_user=(user)  
  6.     if new_record?  
  7.       self.creator = user  
  8.     else 
  9.       self.editor = user  
  10.     end  
  11.   end  
  12. end 

你可以看到它精煉的告訴了我們發(fā)生了什么。這段代碼說,這個類有一個記錄創(chuàng)建者,一個編輯者,我們用editing_user賦給它們值。沒有回調(diào)干擾。沒有幾個private方法的無用信息。

一個更經(jīng)典的例子。在controller里管理數(shù)據(jù)

  1. class PostsController < ApplicationController  
  2.   def create  
  3.     if params[:post][:text].present?  
  4.       if params[:post][:text] =~ /fuck|cock|shit/  
  5.         flash[:error] = "Be nice" 
  6.         @achtung = true 
  7.       end  
  8.     end  
  9.  
  10.     if !@achtung  
  11.       @post = Post.new(params[:post])  
  12.  
  13.       if @post.save  
  14.         flash[:success] = "Yoo hoo!" 
  15.         redirect_to :index  
  16.       else 
  17.         render :new 
  18.       end  
  19.     else 
  20.       redirect_to :index  
  21.     end  
  22.   end  
  23. end 

所有的這些條件邏輯跟你的controller實際上沒有任何關(guān)系。所有的這些邏輯判斷并不屬于controller層負責。當然,你可以這樣做,而其能正常的運行,但這不是好的軟件。

試試這樣寫

  1. class PostsController < ApplicationController  
  2.   def create  
  3.     @post = Post.new(params[:post])  
  4.  
  5.     if @post.save  
  6.       flash[:success] = "Yoo hoo!" 
  7.       redirect_to :index  
  8.     else 
  9.       render :new 
  10.     end  
  11.   end  
  12. end  
  13.  
  14. class Post < ActiveRecord::Base  
  15.   validate :bad_language_check  
  16.  
  17. private 
  18.  
  19.   def bad_language_check  
  20.     if text =~ /fuck|shit|cock/  
  21.       errors.add(:text, "has some pretty bad language")  
  22.     end  
  23.   end  
  24. end 

現(xiàn)在你的controller能清楚的說明白發(fā)生了什么。你可以清楚的看明白當記錄可以創(chuàng)建和不能創(chuàng)建時會發(fā)生什么。跟Post類一樣,你可以清楚的理解它在過濾那些不干凈的文字。而且校驗器有自己單獨的地方。它的實現(xiàn)方式不會影響Post本身。

結(jié)論

其實很簡單。想寫出好的軟件嗎?別再給機器寫代碼,從此后為人寫代碼。

就這么簡單。

英文原文:The Trick To Good Software

譯文連接:http://www.aqee.net/the-trick-to-good-software/

 

 

責任編輯:林師授 來源: 外刊IT評論
相關(guān)推薦

2020-08-31 10:54:05

勒索軟件漏洞網(wǎng)絡(luò)安全

2009-12-14 14:36:40

VS 2008軟件

2009-09-28 11:06:00

CCNA自學(xué)訣竅CCNA

2020-05-25 22:39:38

機器學(xué)習物聯(lián)網(wǎng)IOT

2016-10-25 13:46:25

深度學(xué)習機器學(xué)習性能提升

2024-03-01 16:12:11

2011-10-17 09:47:53

應(yīng)用性能工作負載服務(wù)器

2010-03-24 17:57:36

2013-01-11 11:32:51

2010-10-12 10:15:45

升級無線網(wǎng)卡

2024-09-03 08:24:52

RestfulAPI結(jié)構(gòu)

2019-01-18 09:50:14

物聯(lián)網(wǎng)數(shù)據(jù)IOT

2011-06-13 14:05:58

描述標簽

2018-08-28 16:02:59

LinuxShellBash

2021-06-22 09:18:13

Python代碼技巧

2010-03-12 09:57:00

寫好簡歷

2016-10-17 14:29:01

數(shù)據(jù)中心恒溫恒濕“智”冷

2015-10-28 15:04:06

程序員好代碼好文檔

2015-10-26 09:57:10

程序員既要代碼好文檔

2011-03-23 14:09:50

Oracle數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號