各司其職桥氏,讓你的世界秩序凌然

很多人在初入行業(yè)的時(shí)候温峭,喜歡走到哪寫到哪,隨手一時(shí)爽识颊,一直隨手一直爽诚镰,重構(gòu)直接火葬場(chǎng)奕坟。很多人會(huì)搬出來單一職責(zé)或者其他設(shè)計(jì)原理或者設(shè)計(jì)模式來給你解釋祥款,當(dāng)然,本期不講這些月杉。我們來聊一聊:展示組件和容器組件刃跛。

又是一個(gè)晴朗的周末,爬起來已經(jīng)中午了苛萎,突然發(fā)現(xiàn)身邊亂糟糟的桨昙,書啊,衣服啊腌歉,電腦啊丟的到處都是蛙酪。今天還有人來家里進(jìn)行友好訪問(俗稱過來白嫖一頓飯),這么亂可不行翘盖,那么稍微起來收拾收拾吧桂塞。

// example .01 code
const clean = good => {
  if (good === 'clothes') {
    return 'My clothes are in the closet';
  } else if (good === 'book') {
    return 'My book is in the bookcase';
  } else if (good === 'laptop') {
    return 'My laptop is on the desk';
  } else {
    return false;
  }
};

const goodsInRoom = ['clothes', 'book', 'laptop'];

(() => {
  goodsInRoom.forEach(good => {
    const result = clean(good);
    console.log(result ? result : `${good} is not clean`);
  });
  console.log('My room is clean');
})();

看起來這樣就可以輕松的收拾房間了呢,但是馍驯,好像地面需要打掃阁危,我還需要掃地、拖地汰瘫。

突然狂打,我放佛覺得哪里不對(duì)勁,什么都要我干混弥,老子那個(gè)破掃地機(jī)器人趴乡,買了當(dāng)大爺嗎?不行,我需要讓他也干活晾捏。

class SweepingRobot {
    #range = [];

    constructor(name) {
        this.name = name;
    }

    setRange(range) {
        this.#range = range;
    }

    clean() {
        this.#range.forEach(range => {
            console.log(`${this.name} -> ${range}: start to clean`);
        );
    }
}

const robotClean = range => {
    const sweepingRobot = new SweepingRobot('斯沃特機(jī)器人');
    sweepingRobot.setRange(range);
    sweepingRobot.clean();
};

// ... example .01 code here ...

(() => {
    goodsInRoom.forEach(good => {
        const result = clean(good);
        console.log(result ? result : `${good} is not clean`);
    });

    robotClean(['廚房', '臥室', '洗手間', '陽(yáng)臺(tái)']);
    console.log('My room is clean');
})();

看起來真不錯(cuò)官辽,回過頭,我們看看整個(gè)過程粟瞬,我們?cè)谥魅肟谑紫劝盐锲氛砹送停缓笳{(diào)用robotClean方法清理了廚房、臥室裙品、洗手間俗批、陽(yáng)臺(tái)四個(gè)地方,我的房間終于干凈了市怎。

看起來岁忘,這很符合邏輯,先收拾房間嘛区匠,收拾完之后干像,發(fā)現(xiàn)房間太臟了,要掃地拖地驰弄,我就創(chuàng)建一個(gè)掃地機(jī)器人麻汰,替我干活就好了。

回歸引言:隨手一時(shí)爽戚篙,一直隨手一直爽五鲫,重構(gòu)直接火葬場(chǎng)。

很奇怪岔擂,我們按照正常的邏輯位喂,哪里不對(duì)呢?不對(duì)乱灵,不對(duì)大發(fā)了塑崖。

看似都狠符合邏輯,但是這是人的邏輯痛倚,不是機(jī)器的邏輯规婆,在機(jī)器的世界里,他需要一個(gè)抽象的状原,秩序凌然的世界聋呢。房間就是用來展示,房間不會(huì)自己打掃自己颠区,打掃的只能是工具人削锰。工具人要分開,比如我就可以收拾衣服毕莱、收拾書器贩、收拾電腦颅夺,而我的掃地機(jī)器人就會(huì)打掃指定區(qū)域。

那么這樣做還有其他好處嗎蛹稍?有吧黄,當(dāng)有人接手你的代碼的時(shí)候,你希望別人上來就是一句“f**k”嗎唆姐?混亂的代碼拗慨,會(huì)意味著你的邏輯也是混亂的,也就是你在寫這塊的時(shí)候奉芦,并沒有想好要怎么做要做什么赵抢。通往高級(jí)的一個(gè)重要點(diǎn)就是需要有代碼設(shè)計(jì)能力,這個(gè)設(shè)計(jì)可以通俗的理解成抽象能力声功。

那么讓我們烦却,提升抽象能力,開啟新的篇章先巴,向高級(jí)邁進(jìn)其爵!

按例:(先來介紹展示組件和容器組件)

Presentational components are concerned with how things look.展示組件關(guān)注事物的外觀

Container components are concerned with how things work.容器組件關(guān)注事物如何工作

很多人會(huì)好奇,這不是 React 老生常談的伸蚯,拆分組件要注意展示組件和容器組件嘛摩渺?關(guān)我們寫函數(shù)有啥關(guān)系。其實(shí)不然朝卒,展示和容器其實(shí)追溯應(yīng)該回歸到mvc體系证逻,我們應(yīng)該活用這樣的思想去整理自己的代碼乐埠,分析一下我們打掃房間這個(gè)過程抗斤。

  1. 房間僅做展示效果,無論是臟亂丈咐,還是干凈整潔瑞眼。
  2. 我可以收拾衣服、書棵逊、電腦伤疙,講他們放到原位。
  3. 斯沃特機(jī)器人可以幫我打掃房間辆影。

抽象出三個(gè)模塊徒像,我、機(jī)器人蛙讥、房間锯蛀,我和機(jī)器人注重的是工作,房間注重的展示次慢,畢竟她還不是一個(gè)成熟的房間旁涤,不會(huì)自己打掃翔曲。

首先創(chuàng)建一個(gè)PersonClass這個(gè)類是抽象類,包含基本功能劈愚,clean方法瞳遍,用來收拾指定的事件。

// PersonClass
class PersonClass {
  #name = '';

  constructor(name) {
    this.#name = name;
  }

  getName() {
    return this.#name;
  }

  clean(event) {
    console.log(`${this.#name} packed up ${event}`);
  }
}

在確認(rèn)了本寶寶雖然是個(gè)寶寶但是還是個(gè)人這個(gè)事實(shí)菌羽,我決定掠械,需要實(shí)現(xiàn)一個(gè)PersonClass類,然后我去繼承一下注祖,但是我這個(gè)人比較厲害份蝴,我不是只能干一件事,我可以按照隊(duì)列執(zhí)行任務(wù)氓轰。

// IhapMrFatClass
class IhapMrFatClass extends PersonClass {
  #room = '';
  #packedEventQueue = [];

  constructor(name, room) {
    super(name);
    this.#room = room;
    this.#packedEventQueue = room.getPackedEventQueue();
  }

  clean() {
    let event = '';
    while ((event = this.#packedEventQueue.shift())) {
      super.clean(event);
    }
    this.#room.setPackedEventQueue(this.#packedEventQueue);
  }
}

繼續(xù)我們搞一個(gè)機(jī)器人類婚夫,機(jī)器人類也是一個(gè)抽象類,當(dāng)然和我們?nèi)祟愐膊畈欢嗍鸺Γ灿幸粋€(gè)clean方法案糙。

// RobotClass
class RobotClass {
  #name = '機(jī)器人';

  constructor(name) {
    this.#name = name;
  }

  getName() {
    return this.#name;
  }

  clean(range) {
    console.log(`${this.#name} -> ${range}: cleaned`);
  }
}

接下來創(chuàng)建一個(gè)掃地機(jī)器人類來繼承機(jī)器人類,掃地機(jī)器人就是需要一個(gè)區(qū)域范圍靴庆,然后在區(qū)域范圍內(nèi)打掃时捌。

// SweepRobotClass
class SweepRobotClass extends RobotClass {
  #room = '';
  #cleanedRange = [];

  constructor(name, room) {
    super(name);
    this.#room = room;
    this.#cleanedRange = room.getCleanedRange();
  }

  clean() {
    let range = '';
    while ((range = this.#cleanedRange.shift())) {
      super.clean(range);
    }
    this.#room.setCleanedRange(this.#cleanedRange);
  }
}

好了,既然兩個(gè)“工具人”都搞定了炉抒,我們就來搞一搞我們的展示組件奢讨,展示組件需要的就是進(jìn)行房間初始化,當(dāng)房間在創(chuàng)建的時(shí)候焰薄,就有一個(gè)待打掃隊(duì)列拿诸,比如packedEventQueue待收拾事件隊(duì)列以及cleanedRange待清潔區(qū)域,在渲染render的時(shí)候塞茅,首先檢查一下頁(yè)面清理狀態(tài)亩码,然后根據(jù)狀態(tài)告訴大家,是否干凈野瘦。本身是不會(huì)與外界有任何交互描沟,僅會(huì)提供一些方法出去,交給外部去處理鞭光。換句話就是吏廉,作為一個(gè)不成熟的RoomClass,她是不會(huì)自己打掃自己的惰许,她也不管到底是誰打掃席覆,總之,她里面就是包含待收拾事件隊(duì)列以及待清潔區(qū)域啡省,只要打掃干凈了娜睛,她就認(rèn)為干凈了髓霞。

// RoomClass
class RoomClass {
  #packedEventQueue = [];
  #cleanedRange = [];
  #clearStatus = false;

  constructor(initStatus) {
    const { packedEventQueue, cleanedRange } = initStatus;
    this.#packedEventQueue = packedEventQueue;
    this.#cleanedRange = cleanedRange;
  }

  setPackedEventQueue(packedEventQueue) {
    this.#packedEventQueue = packedEventQueue;
  }
  getPackedEventQueue() {
    return this.#packedEventQueue;
  }

  setCleanedRange(cleanedRange) {
    this.#cleanedRange = cleanedRange;
  }
  getCleanedRange() {
    return this.#cleanedRange;
  }

  _checkClearStatus() {
    this.#clearStatus = !(this.#packedEventQueue.length || this.#cleanedRange.length);
  }

  render() {
    this._checkClearStatus();
    console.log(this.#clearStatus ? '干凈的房間' : '臟亂的房間');
  }
}

好了,讓我們用起來吧

const packedEventQueue = ['clothes', 'book', 'laptop'];
const cleanedRange = ['廚房', '洗手間', '客廳', '陽(yáng)臺(tái)'];

const ihapMrFatRoom = new RoomClass({ packedEventQueue, cleanedRange });
ihapMrFatRoom.render();
// 臟亂的房間

const ihapMrFat = new IhapMrFatClass('ihap 肥少', ihapMrFatRoom);
ihapMrFat.clean();

const sweepRobot = new SweepRobotClass('掃地機(jī)器人', ihapMrFatRoom);
sweepRobot.clean();

ihapMrFatRoom.render();
// 干凈的房間

這樣畦戒,主函數(shù)是不是很清晰明了了呢方库,不光我們的主函數(shù)清晰明了,我們的各大工具人也分工明確障斋,做著他們工具人的本分纵潦,而我們的展示組件,也在盡心盡力的展示著我房間從臟亂到干凈的過程垃环。

請(qǐng)注意邀层,不是任何情況都要有展示組件,展示組件也不是一定不能做任何的邏輯遂庄,只是展示組件不對(duì)外做任何處理寥院。

打掃完了房間,朋友們也差不多到了涛目,我們 high 了一晚秸谢,結(jié)果,第二天我醒來之后霹肝,又是臟亂的房間估蹄。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

我是 ihap 肥少,喜歡我的文章沫换,請(qǐng)關(guān)注喲臭蚁。我們是 ihap 技術(shù)黑洞,更多咨詢讯赏、擼貓一手資料垮兑,快關(guān)注吧!

參考文獻(xiàn):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末待逞,一起剝皮案震驚了整個(gè)濱河市甥角,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌识樱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震束,死亡現(xiàn)場(chǎng)離奇詭異怜庸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垢村,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門割疾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘉栓,你說我怎么就攤上這事宏榕⊥刂睿” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵麻昼,是天一觀的道長(zhǎng)奠支。 經(jīng)常有香客問我,道長(zhǎng)抚芦,這世上最難降的妖魔是什么倍谜? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮叉抡,結(jié)果婚禮上尔崔,老公的妹妹穿的比我還像新娘。我一直安慰自己褥民,他們只是感情好季春,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著消返,像睡著了一般鹤盒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侦副,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天侦锯,我揣著相機(jī)與錄音,去河邊找鬼秦驯。 笑死尺碰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的译隘。 我是一名探鬼主播亲桥,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼固耘!你這毒婦竟也來了题篷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤厅目,失蹤者是張志新(化名)和其女友劉穎番枚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损敷,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葫笼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拗馒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片路星。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诱桂,靈堂內(nèi)的尸體忽然破棺而出洋丐,到底是詐尸還是另有隱情呈昔,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布友绝,位于F島的核電站堤尾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏九榔。R本人自食惡果不足惜哀峻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哲泊。 院中可真熱鬧剩蟀,春花似錦、人聲如沸切威。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)先朦。三九已至缰冤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喳魏,已是汗流浹背棉浸。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刺彩,地道東北人迷郑。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像创倔,于是被迫代替她去往敵國(guó)和親嗡害。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容