主頁 >  其他 > 業務、設計模式、演算法

業務、設計模式、演算法

2021-01-30 06:36:43 其他

前言

很久沒有寫心得,一來是懶了,二來是難,早就很想寫一點有關業務邏輯和模式、演算法的關系,可以找到很多理論,但卻很少有理論實際相結合的文章,以至于許多人認為服務端代碼就是CRUD,演算法無用,設計模式無用,還有一種人他們認為設計模式已經融入自己日常的開發中,不需要特別去在意,這兩種情況我都經歷過,在寫了這么多年代碼后才意識到,自己思考的還是太淺,這篇文章就算是拋磚引玉吧,

抽象

抽象是從眾多的事物中抽取出共同的、本質性的特征,而舍棄其非本質的特征的程序,

在編碼作業程序中,我們或多或少、有意無意的會進行一些抽象,其中最常見的,就是將事物轉為變數,一個簡單的變數就可以完成大量的抽象,對于一個書店,設計一個“book”變數,就可以代表所有的書,我們換一下它的名字改為“goods”,它就能代表任何可以銷售的商品,而不僅僅是書,這一切看起來非常簡單,太簡單了,那我們怎么會在最后要重構代碼,技術迭代趕不上業務發展,業務越來越好,代碼越寫越苦?

本質

在寫代碼的時候,尤其是互聯網常見的服務端業務代碼,通常是將現實行為做數字化的程序,例如在超市結算的時候,交錢,拿貨走人,在淘寶上要復現這個行為,就得將錢和商品數字化,可以被代碼表達,那么,萬一有人要插隊怎么辦?萬一網銀突然無法支付怎么辦?萬一商品中有贈品怎么判斷,有活動商品怎么判斷,臨時有商品因為碼掃不出(類似缺貨)怎么辦,全部都需要考慮,而這些現實中可能發生的問題,在線上也幾乎都會發生,代碼就要考慮,

無窮大的問題

那么理論上有多少問題需要考慮呢?這讓我回想起第一節概率論的課上,老師問的一個問題:2個人約好10點見面,10點同時到達的概率是多少?因為到達的情況是無窮大,所以同時到達概率是0,這個問題也一樣,現實中有無窮多種問題需要考慮,而這正是我們重構噩夢的開始,看過《銀河系漫游指南》的同學應該知道有個“沉思”的超級電腦,它為了計算出宇宙的究極問題,設計了“地球”這個更加強大的電腦,事情就是這樣,你要用程式表達這個世界,你需要的資源就是這個世界本身,除非你能從更高的緯度空間來設計,

妥協

既然我們不可能表達完整的世界,我們就需要想辦法去表達部分,

骨架

現代科學可以根據恐龍的骨骼化石來估計肌肉的走向和大小,從而還原它的外形,我們不能表達整個世界,但可以想辦法表達它的骨架,選擇性的表達是最常見的手段,它的重點在于:骨架要在它準確的位置上,不要因為肌肉的缺失而偏離,例如錢,無論在數字錢包的時代還是紙幣的時代,它在生產生活中的價值是不變的,我們就認為我們找對了骨架:價值,
我們可以用 y = ax + b表達任意一條實數域內的直線,但是現實中沒有哪條線是直的,但”直“這件事作為骨架是對的,

程式就是這個世界的“骨架”,

邊界

很多問題在有限的邊界內是是有限的,比如人際關系,在一代直系血親中,只會出現父母和子女,但是擴展到整個人類社會,會出現父親的叔叔,父親的叔叔的爺爺,父親的叔叔的爺爺的老婆的娘家,,,通過邊界約束問題范圍,正是很多DDD設計和微服務架構建設的目的,只不過微服務是一種“死緩”的做法,而DDD只是用于幫助思考,不直接解決問題,為什么說微服務是死緩?很多微服務在一開始是“微”服務,隨著業務復雜,就變成“腫服務”,拆分?不好意思,業務等不起,

邊界的合理性

當我們給問題畫上了邊界,怎么才知道邊界是合理的?合理的邊界應該是:

  1. 邊界內元素可以被完整描述,也就是全集,
  2. 邊界內元素是互斥的,

完整的描述有2種方法

列舉

比如:邊界 = 性別,值 = [男,女,男改女,女改男,男改女又改男...],每次提到性別這個屬性,總有那么幾個壞小子要懟我,雖然不是惡意,但是也說明這個邊界有點問題,
邊界改 = 當前性別,值 = [男,女],
看,通過“當前”2個字修飾的性別,就好多了,

使用公式

之前直線上的點已經說明了這種方法,而公式描述又可以通過分段函式、取樣函式進一步將邊界合理化,比如年齡,只有正整數,

互斥

被描述的內容在邊界的約束下,元素是唯一的,例如年齡,1歲和2歲就是互斥,如果要描述一群人的年齡,往往會有同歲的,那么邊界約束就要增加一個:某人,人在人類現實社會的邊界內,是不會重復的,而一個人的當前年齡只有一個,所以一群人中某個人的年齡是唯一的,年齡 + 人 共同約束了一個邊界范圍,就像分段函式有多個約束條件,你可以看到,慢慢的我們發現在使用數學方法來描述問題,而這些數學方法的可以通過“演算法”最終實作,這就是演算法的作用,

妥協后的抽象

有點經驗的研發很快就會發現,上面的例子反應在關系型資料庫中,就是唯一索引和復合唯一索引,這沒什么稀奇的,接下來我要舉一個栗子來說它到底怎么毀了我們幸福的coding生活,有一個專案,要研究不同的食草動物吃什么植物,研發團隊根據OOP思想,抽象了動物,動物行為,植物,又把植物和動物都抽象為“生物”以描述共性,完美,開始寫代碼:

動物->吃(植物);//return 要死 or 健康;

好了,一切都很正常,微生物要吃什么,食肉動物要怎么吃都沒有問題,還有點擴展性,不錯,

同時,在隔壁的一個部門,接了另一個需求,他們要研究植物,以及他們可以作為那些動物的食物,于是他們寫了另一種代碼:

植物->被(動物)->吃();//return 可以 or 不可以;

老板覺得兩個部門做的有點重復,你們合并吧,反正都是吃,為啥要寫兩個?兩邊研發團隊當晚打了一架,要求對方放棄自己的方案,最終動物研究部門因為體力比較好,植物研究部門放棄了自己的方案,第二天老板走進辦公室說:我們今天研究一種植物叫豬籠草,它吃動物,,,動物部門一咬牙,行,我還有辦法,凡是生物它都有吃,他們可以相互吃,,,
新的抽象

生物->吃(生物);//return 可以 or 不可以;

到這里,我們才看到了真正的骨架,研發團隊發現之前的邊界都是有缺陷的,動物、植物都只是生物圈的一部分,這還沒囊括微生物,重構問題的發生,往往是我們沒有找到骨架,沒有摸清邊界,在我們研發的程序當中,太多人喜歡寫“動物->吃(植物);”這樣的代碼,很簡單,也滿足業務當前需求,如果抽象到“生物->吃(生物);//return 可以 or 不可以;”便可能被戴上“過度設計”的帽子,久而久之,大家就怕了,

沿著骨架重構是容易的

如果你在紙上畫了一條短一點的直線,如果需要一條長直線,延長便可,這很容易,如果一開始畫的是弧線,要得到一條長的直線,你就得擦干凈重畫(重構),或者換個地方(重寫),以生物行為研究為例,如果一開始就把吃的行為賦予“生物”這個基礎類,然后只實作動物的“吃”,而不關心植物的吃,比如豬籠草,這就降低了研發壓力,后來出現豬籠草的需求,在植物類中覆寫掉吃方法,植物就有不同的吃法了,微生物也一樣,被吃是一個道理,食物鏈頂端也會被微生物吃掉,同樣可以放在生物類中,這樣我們的代碼就是循序漸進的,可不斷疊加,

設計模式

終于說到設計模式,幾乎所有的設計模式,都在幫助我們解決豬籠草問題,只是方式不同罷了,但是他們不能解決邊界劃分和骨架尋找問題,這就是為什么很多人覺得,用了設計模式,擴展性也不是很好,那么說DDD,DDD其實是在提醒你,你要去尋找邊界和骨架,它也不是告訴你如何去找,之前有個研究DDD的大牛來分享怎么劃分邊界,有一個簡化版工序,大概有19道吧,反正我是記不得,總之不是一件簡單的事情,

總結

“業務“分析來得到抽象,分析的方法就是畫邊界和抽骨架的程序,方法我也就那么點都寫在上面了,
而”抽象“需要數學來描述,”數學”需要演算法來編碼,”編碼“需要模式來避免重構,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254354.html

標籤:其他

上一篇:2021寒假每日一題《摘花生》

下一篇:簡單三步,通過作業流(ASW)快速完成訂單資料處理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more