成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解讀荷蘭DigiD應用程序非常高效的代碼重構

開發 前端
對于經驗豐富的開發人員來說,較短的版本可能需要幾秒鐘才能弄清楚發生了什么。如果代碼是幾周前編寫的,嗯,可能需要多花幾分鐘時間才能理解。

今天我在看到一個程序員發布了一個非常有趣的代碼片段(非常高效的代碼)。

這段代碼像病毒一樣傳播開來,你可能已經在不同的平臺上看到過它。

關于這個話題有許多爭論。一些人認為有更短(也許也更好)的版本來做同樣的工作。

例如,我請求ChatGPT重寫一個更短的版本,得到如下結果:

是不是越短越好?

說實話,我對原版的反應是,什么鬼?我暗自發笑,認為我可以在5分鐘內使用map或類似的巧妙技術對其進行重構。然而,喝了杯咖啡后,我又看了看代碼片段。我發現意圖非常明確,諷刺的是,map版本需要更多的時間閱讀。

對于經驗豐富的開發人員來說,較短的版本可能需要幾秒鐘才能弄清楚發生了什么。如果代碼是幾周前編寫的,嗯,可能需要多花幾分鐘時間才能理解。

原始代碼有什么問題?

盡管第一個版本的代碼看起來簡單明了,但它有一個缺點,就是不能將表示和業務邏輯結合起來。軟件被設計為具有靈活性和適應性,這個版本的代碼使得將來更難進行更改。

說它混合了表現和邏輯,我的意思是,如果明天我們想顯示一個紅點(而不是藍色的),我們必須修改相當多的地方。

除此之外,我想先解決一個與邏輯泄漏有關的小問題。你可能已經注意到,它多次重復precentage> x &&precentage<= y,我將提取一個函數,使其更具可讀性:

const isPercentageInRange = (number: number, low: number, high: number) =>
number > low && number <= high;

如果我將百分比檢查分成兩個函數,并將藍色和白色的點畫在兩個函數中,并將結果安排在新的getPercentageRounds中,代碼將如下所示:

const getBandByPercentage = (percentage: number) => {
if (percentage === 0) return 0;

if (isPercentageInRange(percentage, 0.0, 0.1)) return 1;
if (isPercentageInRange(percentage, 0.1, 0.2)) return 2;
if (isPercentageInRange(percentage, 0.2, 0.3)) return 3;
if (isPercentageInRange(percentage, 0.3, 0.4)) return 4;
if (isPercentageInRange(percentage, 0.4, 0.5)) return 5;
if (isPercentageInRange(percentage, 0.5, 0.6)) return 6;
if (isPercentageInRange(percentage, 0.6, 0.7)) return 7;
if (isPercentageInRange(percentage, 0.7, 0.8)) return 8;
if (isPercentageInRange(percentage, 0.8, 0.9)) return 9;
return 10;
};

const drawProgress = (percentage: number) => {
const band = getBandByPercentage(percentage);
return new Array(10).fill("", 0, band).fill("?", band, 10);
};

const getPercentageRounds = (percentage: number) => {
return drawProgress(percentage).join("")
}

函數getBandByPercentage將百分比映射到一個范圍(或級別),而drawProgress根據范圍繪制圓點。

讓演示更加靈活。

我們可以提取藍白色的點作為參數,讓進度條更加靈活。此外,為了保持當前行為,我們可以使用當前值作為默認值:

const drawProgress = (
percentage: number,
done: string = "",
doing: string = "?"
) => {
const band = getBandByPercentage(percentage);
return new Array(10).fill(done, 0, band).fill(doing, band, 10);
};

然后可以在命令行中創建一個進度條,如下所示:

const getPercentageRounds = (percentage: number) => {
return drawProgress(0.3, '#', '=').join("")
}

如果想讓進度條變寬,可以傳入一個較長的版本字符串,表示“完成”和“正在做”:

const getPercentageRounds = (percentage: number) => {
return drawProgress(0.3, '##', '==').join("")
}

所以我們可以有不同的進度條,短的和長的,藍色和紅色的。

代碼配置

重構之后,表示和邏輯被拆分。我不喜歡使用這么大的if-else語句塊:

const getBandByPercentage = (percentage: number) => {
if (percentage === 0) return 0;

if (isPercentageInRange(percentage, 0.0, 0.1)) return 1;
if (isPercentageInRange(percentage, 0.1, 0.2)) return 2;
if (isPercentageInRange(percentage, 0.2, 0.3)) return 3;
if (isPercentageInRange(percentage, 0.3, 0.4)) return 4;
if (isPercentageInRange(percentage, 0.4, 0.5)) return 5;
if (isPercentageInRange(percentage, 0.5, 0.6)) return 6;
if (isPercentageInRange(percentage, 0.6, 0.7)) return 7;
if (isPercentageInRange(percentage, 0.7, 0.8)) return 8;
if (isPercentageInRange(percentage, 0.8, 0.9)) return 9;

return 10;
};

正如Martin Fowler的文章所討論的,在某些情況下,將“代碼”拆分到配置文件中是有益的。

我們可以將這個百分比移動到band mapping中,比如(甚至可以將bandConfig移動到JSON文件中):

const bandConfig: BandConfig[] = [
{
range: [-Infinity, 0.0],
band: 0,
},
{
range: [0.0, 0.1],
band: 1,
},
//...
];

然后getBandByPercentage可以簡化為

const getBandByPercentage = (percentage: number) => {
const config = bandConfig.find((c) => {
const [low, high] = c.range;
return isPercentageInRange(percentage, low, high)
});

return config?.band;
};

隨著復雜性轉移到配置文件,getBandByPercentage函數只剩下幾行了。

重用邏輯?

讓我再演示一個用例來展示拆分可以帶來什么。現在假設我們想在Web UI中使用進度條——例如ProgressBar組件。

導入drawProgress函數非常容易:

const ProgressBar = ({
percentage,
}: {
percentage: number;
done?: string;
doing?: string;
}) => {
return (
<>
{drawProgress(percentage).map((character) => (
<span>{character}</span>
))}
</>
);
};

在頁面上,我們可以看到這樣的內容:

我們可以輕松地更改組件中的句點字符,并使進度條更容易適應新的UI需求。

總結

最終的結果可能沒有原始結果那么“高效”。盡管如此,通過明確的關注點分離(表示和業務邏輯,以及邏輯和配置),它可以對新需求做出更積極的響應。

責任編輯:姜華 來源: 今日頭條
相關推薦

2015-10-21 13:57:09

WatchKit 要點開發

2023-10-25 10:46:56

Radius開源

2010-02-04 09:41:03

Android應用程序

2010-02-22 15:49:35

Python應用程序

2010-02-26 09:55:22

Python應用程序

2024-11-04 11:02:56

2010-01-25 10:57:57

Android系統應用

2024-02-26 00:01:01

RedisGolang應用程序

2011-07-21 16:19:30

iOS Twitter

2015-04-02 09:12:36

云計算Docker樂高積木

2012-04-06 14:23:53

技術門診Android

2017-11-30 11:19:12

重構微服務程序

2010-07-15 11:34:13

應用虛擬化桌面虛擬化基礎架構

2012-10-11 09:17:07

2022-06-17 09:58:23

JVM應用程序

2023-12-12 13:42:00

微服務生態系統Spring

2009-08-14 18:04:59

C#Windows應用

2022-05-31 16:15:23

低代碼

2015-04-01 11:03:39

2012-06-07 09:15:14

ibmdw
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲第一av网站 | 亚洲成人综合社区 | 久久青青| 91电影院| 久久黄色网| 欧洲一区二区在线 | 欧美一区二区三区久久精品视 | 亚洲 欧美 另类 日韩 | 欧美亚洲视频 | 日韩成人av在线 | 亚洲性视频网站 | av中文字幕在线 | 国产精品欧美一区二区三区不卡 | 成人免费观看男女羞羞视频 | 国产一级黄色网 | 亚洲精品2| 国产精品自拍啪啪 | 日韩视频一区二区 | 欧美理伦片在线播放 | 日韩欧美一区二区三区四区 | 99久久婷婷国产综合精品 | 99视频在线免费观看 | 亚洲美女在线一区 | 91深夜福利视频 | 一区二区三区在线免费看 | 日韩欧美在线播放 | 久久久久一区二区三区 | 精品国产一区二区国模嫣然 | 男女精品网站 | 亚洲综合无码一区二区 | 免费h视频| 三级黄色片在线观看 | 日韩精品一区二区三区 | 久久一久久 | 偷拍亚洲色图 | 亚洲精品视频免费 | 日本网站免费观看 | 久久精品国产99国产精品 | 一级黄色夫妻生活 | 国产欧美一区二区三区免费 | 精品久久久一区 |