1. 程式人生 > >如何避免設計過度與不足

如何避免設計過度與不足

        在知乎上看到關於“什麼是軟體開發中的過度設計”的問題,其中一個回答很形象,摘要如下:

        假如今天你打算開發一個知乎的客戶端,那麼一個過度設計的"你"就開始琢磨了,嗯,我要面向物件,我要可擴充套件,我要牛逼!開始設計,首先業務和介面要分開,先用庫的形式搞一個知乎sdk,然後你就搞了一大堆介面,可是介面還沒實現呢,你又想了,我要通用啊,現在的社群網站有一定的共同點,我要把他們的sdk封裝到一起!對,這樣牛逼,回頭我一開源說不定大家還會表揚我呢。然後你就開始閱讀各種api文件,微博,騰訊,天涯,豆瓣,人人。。。你甚至把email都放進去了,作了很多看起來特別偉大的抽象,終於把sdk設計好了。這時候你又想,介面通用還不夠,我的實現也要通用,對,把ios,android和桌面系統的底層都封裝起來。。。這事有點難,你搞了好久差不多可以了。然後,不出意外的,你又想了,所謂mvc,v也要牛逼啊,我也要做成統一的,最好我這個軟體同時支援各大網站,以後升級的時候把庫加進去,一配置就支援新的網站,對,外掛機制!這個好,eclips就是這樣嘛!跟大師學沒錯。。。於是你開始設計抽象ui部分,等這些都做完了,你還不過癮,你還要內嵌指令碼,外接css,各種跨平臺,各種鬆耦合,你甚至要搞一個objc到java的程式碼生成器,這樣就橫跨ios和android了。。。

        設計過度其實就是使用者想要殺雞刀,但你設計出了殺牛刀甚至是電鋸。

稍加留意,可以發現當你在設計的時候有了下述想法,就要警惕是否在過度設計了。

  • 設計決策以是否面向擴充套件為首要衡量標準。
  • 解決問題的第一思路是設計模式。
  • 相信軟體質量會隨著使用的框架、庫的增加而提升。
  • 追求每一個類、層的可替換性。
  • 如果沒有類圖等外在因素的輔助,很難看懂你的程式碼。
  • 大量零散介面的引入並強調是面向介面程式設計。

另一個極端就是設計不足,設計出來的系統複用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。這個的特徵不太好總結,很容易退化成程式碼問題,我只總結了這樣三個危險現象:

  • 頭腦中沒有設計觀念,寫程式碼時寫到哪想到哪。
  • 程式碼隨意堆砌,可見性、生存期使用混亂。
  • 設計方案無法應對合理的需求變更,維護成本提高。

那麼要怎樣才能減少或避免設計過度與不足呢?

  • 先設計後編碼。老生常談了,可惜知易行難。
  • 先以設計過度為目標,當能意識到已經過度的時候再來糾正,從中提高對‘適度的設計’的理解。如果不具備設計過度的能力,往往也不太清楚什麼是‘適度的設計’,從過度往下降會更容易,但從不足往上升卻很難。所以還是要大膽的去設計,然後才能對設計進行評價。
  • 提高理論認識,多與他人討論設計方案以減少設計不足。多交流,把思維用語言表達出來,在此過程中會發現自我的不足,別人也會指出一些沒考慮的漏洞,以此來彌補不足之處。
  • 在迭代中使用演進式設計以限制設計過度。以滿足需求為出發點,不追求完美的永恆的架構,只追求演進式設計過程,通過迭代不斷的調整和優化。

相關推薦

如何避免設計過度不足

        在知乎上看到關於“什麼是軟體開發中的過度設計”的問題,其中一個回答很形象,摘要如下:        假如今天你打算開發一個知乎的客戶端,那麼一個過度設計的"你"就開始琢磨了,嗯,我要面向

微伺服器:概念,設計,優勢不足,核心,分類,聯絡,原則,基礎,發展,選擇,通訊,定製

2 如何快速搭建一個微服務架構? 3 怎樣將微服務和無伺服器相結合?用新型事件驅動型架構CQRS! 5 微服務實戰(一):微服務架構的優勢與不足 6 推薦Java五大微伺服器及其程式碼示例教程 7 微服務架構 10

PCB資料:平衡PCB層疊設計方法避免設計中串擾

平衡PCB層疊設計方法 平衡結構避免彎曲 不用奇數層設計PCB的最好的理由是:奇數層電路板容易彎曲。當PCB在多層電路粘合工藝後冷卻時,核結構和敷箔結構冷卻時不同的層壓張力會引起PCB彎曲。隨著電路板厚度的增加,具有兩個不同結構的複合PCB彎曲的風險就越大。消除電路板彎曲

敏捷核心思想、設計模式過度設計

這兒只談敏捷開發的核心思想,而不談其他表現形式比如結對程式設計,測試驅動等。本文不是談設計模式,而是談何時該用設計模式。 敏捷開發的核心思想是:只對當前已經發生過>=2次的同類需求變更,去應用抽象,封裝,或設計模式來調整當前架構,以使之能夠靈活適應下次同類需求變更(

避免陷入過度設計的泥潭

本篇文章已授權微信公眾號guolin_blog(郭霖)獨家釋出 學習了許多的設計模式之後,大部分人都會有濫用(或者設計不足)設計模式的經歷,如何在其中找到一個balance,以下的文章

Java中的24種設計模式7大原則

工廠模式 職責 需要 占位符 ati gre template 層次 cto 一、創建型模式 1、抽象工廠模式(Abstract factory pattern): 提供一個接口, 用於創建相關或依賴對象的家族, 而不需要指定具體類.2、生成器模式(Builder pat

微服務架構的優勢不足

rest服務 spring redis dubbo+zookeeper springmvc+mybatis java分布式架構 微服務正在博客、社交媒體討論組和會議演講中獲得越來越多的關註,在Gartner的2014 Hype Cycle上它的排名非常靠前。同時,軟件社區中也有不少持

Javascript設計模式開發實踐詳解(二:策略模式) http://www.jianshu.com/p/ef53781f6ef2

的人 思想 ram gis pan pro msg have 改變 上一章我們介紹了單例模式及JavaScript惰性單例模式應用這一次我主要介紹策略模式策略模式是定義一系列的算法,把它們一個個封裝起來,並且讓他們可以互相替換。比方說在現實中很多時候也有很多途徑到達同一個

設計思想模式之四靜態代理模式

test 創建 靜態代理 pan 代理 對象的訪問 override todo 父類 一 概述 1.什麽是代理模式? 為了隱藏與保護目標對象,為其他對象提供一個代理以控制對該目標對象的訪問。 2.什麽是靜態代理模式? 代理模式有兩種: 靜態代理:代理對象固定。 動態代理:

設計思想模式之五觀察者模式

per -- 什麽 over out junit 測試類 rem second 一 概述 1.什麽是觀察者模式? 將一個對象視作被觀察者,當它發出某種行為或者發生某種變化時,通知所有依賴它的對象(觀察者),這種設計模式叫做觀察者設計模式。 2.觀察者設

細說微服務架構的優勢不足這點事

Rest服務 Redis Spring SpringMVC+Mybatis Dubbo+Zookeeper Java分布式架構 分布式、微服務、雲架構 Spring SpringMVC Spring MVC+Mybatis Dubbo+Zookeeper Redis分布

程序設計基石實踐系列之按值傳遞還是按引用

有趣 name align pos str 堆棧 技術分享 easy pan 從簡單的樣例開始.如果我們要交換兩個整形變量的值,在C/C++中怎麽做呢?我們來看多種方式,哪種能夠做到.void call_by_ref(int &p,int &q) { //

Spark設計理念基本架構

http textfile hdf www 接受 ng- exe tag 高可用 《深入理解Spark:核心思想與源代碼分析》一書前言的內容請看鏈接《深入理解SPARK:核心思想與源代碼分析》一書正式出版上市 《深入理解Spark:核心思想與源代碼分析》一書第一章的內容

移動端網頁設計經驗心得

分段 下一條 操作 適應 med 常用 格式 手機版 大於 智能手機發展確實很迅速,像今年,我的大部分工作就都在移動端網頁上。 再往前些年,看到的手機版/移動版網頁,限制於瀏覽器與手機性能,2g網絡速度等 網頁設計無非是藍、黑、白,界面單調,並且要盡可能的設計簡單。

避免網站過度優化

優化談了不少具體的SEO技巧,做網站優化的朋友還要註意一點,那就是千萬不要過度優化網站。  同樣這又是一個度和平衡的問題。  做SEO的人應該了解所有可以被優化的地方,應該了解怎樣優化這些地方,但同時也應該了解不能同時優化所有這些地方,不然網站很容易被某種形式的懲罰。  典型的過度優化的網站特征包括:  外部

設計模式哲學

word tar .com 進行 引用 方式 tor http itl http://www.cnblogs.com/feng9exe/p/6782945.html 首先要提到的是,不論是過程論還是對象論,都承認一點,那就是程序世界本質上只有兩種東西——數據和邏輯。數據天性

atitit.html編輯器的設計要點框架選型 attilax總結

編輯功能 att 瀏覽器 lan 粘貼 edit 編輯 -m 上傳 atitit.html編輯器的設計要點與框架選型 attilax總結 1. html編輯器的設計要求1 1.1. 障礙訪問 1 1.2. 強大Ajax上傳 1 1.3. Word完美

Spring 框架的設計理念設計模式分析

問題 面向對象編程 -h oop ram 重要 原因 依賴 object 轉自: https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring 的設計理念 前面介紹了 Spring 的三

設計模式Android】抽象工廠模式——嵌合體克隆工廠

設計模式 android 什麽是抽象工廠模式 所謂抽象工廠模式,就是為創建一組相關或者是互相依賴的對象提供一個接口,而不需要指定它們的具體類的設計模式。抽象工廠模式適用於一個對象族有相同的約束的情況,用不抽象的語言解釋就是國內著名開發者服務商環信在Android和iOS平臺都提供了IM SDK,盡管功

設計模式Android】工廠方法模式——化工女神的工廠

設計模式 android 什麽是工廠方法模式 所謂工廠方法模式,就是定義一個用於創建對象的接口,讓子類決定實例化哪個類的設計模式。工廠模式適用於需要生成復雜對象的地方。 工廠方法模式的實現方式 這次我不打算用文學作品舉例了,以前前幾篇文章用《三國演義》和《水滸傳》舉例,某IT社區的技術編輯居然認為我是