日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

每個開發者都應該知道的七個原則

來源: 責編: 時間:2023-11-17 17:13:27 256觀看
導讀軟件開發是一門復雜的領域。是什么讓高質量的軟件與容易出錯、充滿錯誤的軟件有所不同?答案通常在開發人員在編寫代碼時采用的核心原則中。編程原則:優秀代碼的基石編程原則是卓越軟件的基石。這些建議和最佳實踐指導開

軟件開發是一門復雜的領域。是什么讓高質量的軟件與容易出錯、充滿錯誤的軟件有所不同?答案通常在開發人員在編寫代碼時采用的核心原則中。Qqh28資訊網——每日最新資訊28at.com

Qqh28資訊網——每日最新資訊28at.com

編程原則:優秀代碼的基石

編程原則是卓越軟件的基石。這些建議和最佳實踐指導開發人員編寫既功能強大又優雅、易維護和可擴展的代碼。Qqh28資訊網——每日最新資訊28at.com

在本文中,我們深入探討了每個開發者工具包中都應該有的七個基本編程原則:Qqh28資訊網——每日最新資訊28at.com

1. DRY 原則

DRY:不要重復自己 — 減少冗余的關鍵原則。如果你發現自己復制粘貼同一段代碼超過兩次,現在是考慮抽象的時候了。Qqh28資訊網——每日最新資訊28at.com

考慮這種情況:你有三個函數,每個函數都以相同的方式格式化日期。與其在所有三個函數中都有重復的格式化代碼,不如創建一個單一的輔助函數:Qqh28資訊網——每日最新資訊28at.com

// 格式化日期的輔助函數function formatDate(date) {    return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;}// 函數 1: 顯示今天的日期function displayTodaysDate() {    const today = new Date();    return formatDate(today);}// 函數 2: 顯示一周后的日期function displayDateOneWeekFromNow() {    const oneWeekFromNow = new Date();    oneWeekFromNow.setDate(oneWeekFromNow.getDate() + 7);    return formatDate(oneWeekFromNow);}// 函數 3: 顯示一個月前的日期function displayDateOneMonthAgo() {    const oneMonthAgo = new Date();    oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);    return formatDate(oneMonthAgo);

2. KISS 原則

KISS:保持簡單,愚蠢 — 在你的代碼中追求簡單。例如,如果你寫了一個復雜的 if-else 鏈,也許使用 switch 語句或字典會簡化和美化結構:Qqh28資訊網——每日最新資訊28at.com

之前:Qqh28資訊網——每日最新資訊28at.com

function getErrorMessage(errorCode) {    if (errorCode = 'E001') {      return 'Invalid input.';    } else if (errorCode = 'E002') {      return 'Connection timed out.';    } else if (errorCode = 'E003') {      return 'Database error.';    } else if (errorCode = 'E004') {      return 'File not found.';    } else {      return 'Unknown error.';    }}

重構后:Qqh28資訊網——每日最新資訊28at.com

const ERROR_MESSAGES = {    'E001': 'Invalid input.',    'E002': 'Connection timed out.',    'E003': 'Database error.',    'E004': 'File not found.'};function getErrorMessage(errorCode) {    return ERROR_MESSAGES[errorCode] || 'Unknown error.';}

3. SOLID 原則

SOLID 不是一個單一的原則,而是五個設計原則的集合。盡管它們根植于面向對象編程(OOP),但它們的智慧可以更廣泛地應用。Qqh28資訊網——每日最新資訊28at.com

(1) 單一職責原則(SRP): 一個類應該只有一個改變的理由。這意味著每個類應該只有一個任務或功能,確保更容易維護和在更改過程中減少副作用。Qqh28資訊網——每日最新資訊28at.com

考慮這個例子:Qqh28資訊網——每日最新資訊28at.com

// 錯誤的方法class UserManager {    saveUser(user) {      // 保存用戶到數據庫的邏輯    }  generateReport(user) {      // 生成用戶報告的邏輯    }}

更優雅的解決方案是將其拆分為兩個各自處理單一職責的類:Qqh28資訊網——每日最新資訊28at.com

// 正確的方法class UserDatabase {    save(user) {      // 將用戶數據保存到數據庫    }}class UserReport {    generate(user) {      // 為用戶生成報告    }}

在上面的代碼片段中,我們分擔了責任:UserReport 處理用戶的報告生成,而 UserDatabase 管理將用戶數據保存到數據庫。Qqh28資訊網——每日最新資訊28at.com

(2) 開閉原則(OCP): 軟件組件應該對擴展開放,對修改關閉。這允許開發人員在不修改現有代碼的情況下添加新功能,促進可重用性并減少錯誤。Qqh28資訊網——每日最新資訊28at.com

假設你有一個 AreaCalculator 類,用于計算矩形的面積。現在,如果我們添加一個 Circle,AreaCalculator 將需要修改。Qqh28資訊網——每日最新資訊28at.com

// 錯誤的方法class AreaCalculator {    calculateArea(shape) {      if (shape.type = "circle") {        return 3.14 * shape.radius * shape.radius;      } else if (shape.type = "square") {        return shape.side * shape.side;      }    }}

相反,使用 OCP:我們從一個基礎的 Shape 類擴展我們的形狀,允許輕松添加新形狀而不修改 AreaCalculator。Qqh28資訊網——每日最新資訊28at.com

// 正確的方法class Shape {    calculateArea() {}}class Circle extends Shape {    constructor(radius) {      super();      this.radius = radius;    }  calculateArea() {      return 3.14 * this.radius * this.radius;    }}class Square extends Shape {    constructor(side) {      super();      this.side = side;    }  calculateArea() {      return this.side * this.side;    }}

(3) 里氏替換原則(LSP): 子類應該能夠替換其基類而不產生異常。這確保繼承類保持其父類的屬性和行為。Qqh28資訊網——每日最新資訊28at.com

遵循 LSP,我們應該重構設計以確保正確的繼承:Qqh28資訊網——每日最新資訊28at.com

class Bird {    fly() {      // 通用飛行行為    }}class Penguin extends Bird {    // 企鵝不能飛,所以這個方法不應該在這里}

正確的方法是我們將形狀從基本的 Shape 類擴展出來,允許輕松添加新的形狀而不修改 AreaCalculator。Qqh28資訊網——每日最新資訊28at.com

(4) 接口隔離原則(ISP): 類不應該被迫實現它們不使用的接口。相反,接口應該對其目的具體而清晰。Qqh28資訊網——每日最新資訊28at.com

這意味著接口不應該有太多方法,盡量我們將小接口抽取出來,以便類可以只實現它們需要的接口,就像下面的例子:Qqh28資訊網——每日最新資訊28at.com

// 錯誤的方法interface Worker {    work();    eat();    sleep();    swim();}// 正確的方法interface Worker {    work();}interface Eater {    eat();}interface Swimmer {    swim();}

(5) 依賴反轉原則(DIP): 高層模塊不應與低層模塊糾纏在一起;它們都應依賴于抽象。例如在開關和設備的設計中可以找到:Qqh28資訊網——每日最新資訊28at.com

// 錯誤的方法class LightBulb {    turnOn() {}    turnOff() {}}class Switch {    constructor(bulb) {      this.bulb = bulb;    }  operate() {      // 直接控制燈泡    }}

我們可以重構這樣,以便 Switch 可以對任何實現 SwitchableDevice 的設備進行操作,而不僅僅是 LightBulb。Qqh28資訊網——每日最新資訊28at.com

// 正確的方法class SwitchableDevice {    turnOn() {}    turnOff() {}}class Bulb extends SwitchableDevice {    // 實現 turnOn 和 turnOff 方法  }class SwitchDIP {    constructor(device) {      this.device = device;    }  operate() {      // 控制設備    }}

4. YAGNI 原則

YAGNI,“你不會需要它”,警告不要在必要之前添加功能。Qqh28資訊網——每日最新資訊28at.com

例如,如果你正在構建一個博客網站,并考慮添加一個基于用戶寫作的功能來預測用戶的心情,但這對于網站正常運行并不是必需的,那么最好將其留在一邊,至少現在是這樣。Qqh28資訊網——每日最新資訊28at.com

有不必要功能的應用:Qqh28資訊網——每日最新資訊28at.com

class Blog {    constructor(posts) {      this.posts = posts;    }  addPost(post) {      this.posts.push(post);    }  displayPosts() {      // 顯示所有帖子    }  predictUserMoodBasedOnWritings(post) {      // 預測情緒的復雜算法      // ...      return "Happy"; // 只是一個示例情緒    }  notifyUserAboutMood(mood) {      // 通知邏輯      console.log(`Based on your writing, you seem to be ${mood}`);    }}

刪除不必要功能后:Qqh28資訊網——每日最新資訊28at.com

class Blog {    constructor(posts) {      this.posts = posts;    }  addPost(post) {      this.posts.push(post);    }  displayPosts() {      // 顯示所有帖子    }}

5. SoC 原則

SoC,或“關注點分離”,建議不同的功能區域應由不同且最小重疊的模塊管理。Qqh28資訊網——每日最新資訊28at.com

例如,在一個天氣應用程序中,一個模塊可以處理數據獲取,另一個可以管理數據存儲,另一個則可以控制用戶界面。每個都有自己的關注點,與其他模塊分開。Qqh28資訊網——每日最新資訊28at.com

// 1. 數據獲取模塊function fetchWeatherData(city) {    const apiKey = 'YOUR_API_KEY';    const response = fetch(`https://api.weather.com/v1/${city}?apiKey=${apiKey}`);    return response.json();}// 2. 數據存儲模塊function storeWeatherData(data) {    localStorage.setItem('weatherData', JSON.stringify(data));}// 3. 用戶界面模塊function displayWeatherData(data) {    const weatherBox = document.querySelector('#weather-box');    weatherBox.innerHTML = `<h1>${data.city}</h1><p>${data.temperature}°C</p>`;}// 在主應用程序函數中組合它們function weatherApp(city) {    const data = fetchWeatherData(city);    storeWeatherData(data);    displayWeatherData(data);}

6. LoD 原則

LoD(迪米特法則)是開發軟件的一個指導原則,特別是面向對象的程序。在其一般形式中,LoD是松散耦合的一個具體案例。Qqh28資訊網——每日最新資訊28at.com

想象一下餐廳的場景:顧客將訂單(方法)交給服務員,然后服務員將訂單交給廚師。顧客不直接與廚師互動。Qqh28資訊網——每日最新資訊28at.com

class Customer {  constructor(waiter) {    this.waiter = waiter;  }  giveOrder(order) {    console.log("Customer: I'd like to order " + order);    this.waiter.takeOrder(order);  }}class Waiter {  constructor(chef) {    this.chef = chef;  }  takeOrder(order) {    console.log('Waiter: Order received - ' + order);    this.chef.prepareOrder(order);  }}class Chef {  prepareOrder(order) {    console.log('Chef: Preparing ' + order);    // Logic to prepare the food...  }}

7. COI 原則

組合優于繼承原則(COI)建議使用組合(將簡單對象組合以創建更復雜的對象)而不是類繼承。Qqh28資訊網——每日最新資訊28at.com

想象一下你有一個類 Bird 和一個類 Airplane。它們都能飛,但有繼承關系并不合理。相反,你可以有一個 CanFly 類,并將你的 Bird 和 Airplane 類與它組合。Qqh28資訊網——每日最新資訊28at.com

// 錯誤的方法:繼承class CanFly {  fly() {    console.log(this.constructor.name + ' is flying!');  }}class BirdInherit extends CanFly {}class AirplaneInherit extends CanFly {}

通過以下組合方法,你可以輕松地向 BirdCompose 或 AirplaneCompose 添加或刪除功能,而無需進行結構更改或添加不必要的冗余,強調靈活性。Qqh28資訊網——每日最新資訊28at.com

// 正確的方法:組合class CanFlyComposition {  fly() {    console.log('Flying in the sky!');  }}class BirdCompose {  constructor() {    this.flyingCapability = new CanFlyComposition();  }  fly() {    this.flyingCapability.fly();  }}class AirplaneCompose {  constructor() {    this.flyingCapability = new CanFlyComposition();  }  fly() {    this.flyingCapability.fly();  }}

本文鏈接:http://www.www897cc.com/showinfo-26-27961-0.html每個開發者都應該知道的七個原則

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++中生成二維碼和識別二維碼內容的方法

下一篇: C++中函數參數的優秀傳遞方式

標簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網課的原因激活了平板市場,如今網課的時代已經過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環境來了。也就是面對著這種殘酷的
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • AI芯片初創公司Tenstorrent獲三星和現代1億美元投資

    Tenstorrent是一家由芯片行業資深人士Jim Keller領導的加拿大初創公司,專注于開發人工智能芯片,該公司周三表示,已經從現代汽車集團和三星投資基金等
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
Top 主站蜘蛛池模板: 南雄市| 新泰市| 鲁山县| 屏东县| 雷山县| 凉城县| 七台河市| 西盟| 双柏县| 上饶县| 芒康县| 施秉县| 永丰县| 建平县| 汕尾市| 民和| 蓝田县| 台州市| 郸城县| 吴堡县| 江川县| 读书| 扶余县| 濮阳县| 嘉定区| 霍州市| 塘沽区| 安陆市| 六盘水市| 开化县| 莱州市| 新龙县| 巴里| 新干县| 南部县| 宜兴市| 刚察县| 始兴县| 南江县| 株洲市| 逊克县|