亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

通過(guò)facade(尤其是realtime facade)來(lái)使代碼更優(yōu)雅

Eric / 3275人閱讀

摘要:那么如果用的方式會(huì)怎么樣呢現(xiàn)在,不僅看起來(lái)更簡(jiǎn)潔優(yōu)雅,而且也可以測(cè)試了,因?yàn)榭梢赃M(jìn)行,比如說(shuō)這樣你會(huì)發(fā)現(xiàn)最有用的地方就是構(gòu)建簡(jiǎn)潔優(yōu)雅的,同時(shí)呢又不會(huì)影響到代碼的可測(cè)試性。

本文來(lái)自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050

該篇翻譯整理自laravel創(chuàng)始人Taylor的文章:Expressive Code & Real Time Facades,屬于《Laravel底層核心技術(shù)實(shí)戰(zhàn)揭秘》這一課程《laravel底層核心概念解析》這一章的擴(kuò)展閱讀。

laravel 5.4引入了realtime facade的功能,也即任何一個(gè)class都可以隨時(shí)拿來(lái)當(dāng)facade用,只要在其namespace前面加上Facades前綴即可。當(dāng)然這個(gè)功能不可能隨處都用到,但是偶爾呢,用它可以實(shí)現(xiàn)更簡(jiǎn)潔優(yōu)雅、易于測(cè)試的代碼方案。雖然下面的例子講的是laravel 5.4的realtime facade,但是呢,其實(shí)也完全可以用在之前的版本上,因?yàn)樗^的realtime facade,無(wú)非就是系統(tǒng)自動(dòng)給你注冊(cè)成facade而已,鑒于這個(gè)功能又不可能到處用到,所以即使在老的版本里,如果你發(fā)現(xiàn)facade的這種代碼實(shí)現(xiàn)方式更有吸引力,那么自己手動(dòng)注冊(cè)一個(gè)facade也完全可以的。

接下來(lái)的示例是關(guān)于Laravel Forge的,laravel Forge是laravel官方推出的laravel項(xiàng)目部署管理平臺(tái)。當(dāng)使用Forge的時(shí)候,你得在Forge后臺(tái)將你服務(wù)器提供商的賬號(hào)信息填上,然后呢交由Forge來(lái)具體管理。那么,這里假設(shè)呢我們有一個(gè)Model叫Provider,也就是對(duì)應(yīng)著不同的主機(jī)提供商,比如國(guó)外的DigitalOcean、國(guó)內(nèi)的阿里云等。


這里呢假設(shè)我們將所有處理外來(lái)API請(qǐng)求的class放在AppServices文件夾下,我們得對(duì)應(yīng)每一個(gè)主機(jī)供應(yīng)商都有一個(gè)“service”class,假設(shè)DigitalOcean這家供應(yīng)商的service class是這樣的:


接下來(lái)呢,我們得能夠解析這個(gè)服務(wù)類(lèi),基于我們model里的type這一欄的信息,我們可以使用工廠(factory)模式來(lái)實(shí)現(xiàn):


然后呢,我們就可以在需要的地方調(diào)用這個(gè)工廠,來(lái)相應(yīng)地創(chuàng)建一個(gè)server 服務(wù),比如假設(shè)在controller里調(diào)用:

factory = $factory;
    }
    public function store(Request $request, Provider $provider)
    {
        $service = $this->factory->make($provider->type);
        $response = $service->createServer($request->name, $request->size);
        //
    }
}

但是呢,我覺(jué)得這樣還是有些繁瑣,我想要是這樣來(lái)用該多好呢?

service()->createServer(
            $request->name, $request->size
        );
        //
    }
}

我們只想簡(jiǎn)單地調(diào)用Provider這個(gè)實(shí)例上的service方法,然后就能獲取到其背后對(duì)應(yīng)的供應(yīng)商,然后就能直接地createServer。這樣來(lái)寫(xiě)呢,可能更像是我們?nèi)粘V凶钪苯拥乃伎歼^(guò)程,雖然可能背后具體怎么實(shí)現(xiàn)你還沒(méi)搞懂。那么怎么來(lái)實(shí)現(xiàn)呢?假設(shè)不借助facade,我們或許可以這樣:

make($this->type);
    }
}

貌似可行。但是這樣呢,因?yàn)檫@個(gè)factory類(lèi)是直接在service方法內(nèi)部實(shí)例化的,這是不好的,后期我們無(wú)法用它來(lái)mock測(cè)試。那么如果用realtime facade的方式會(huì)怎么樣呢?

type);
    }
}

現(xiàn)在,不僅看起來(lái)更簡(jiǎn)潔優(yōu)雅,而且也可以測(cè)試了,因?yàn)閒acade可以進(jìn)行mock,比如說(shuō)這樣:

create([
            "id" => 1,
            "type" => "DigitalOcean",
        ]);
        $service = Mockery::mock(ServerProvider::class);
        ServerProviderFactory::shouldReceive("make")
                    ->with("DigitalOcean")
                    ->andReturn($service);
        $service->shouldReceive("createServer")
                    ->once()
                    ->with("web", "2GB")
                    ->andReturn("server-id");
        $response = $this->json("POST", "/api/providers/1/server", [
            "name" => "web",
            "size" => "2GB",
        ]);
        $response->assertStatus(201);
    }
}

你會(huì)發(fā)現(xiàn)real-time facade最有用的地方就是構(gòu)建簡(jiǎn)潔、優(yōu)雅的object APIs,同時(shí)呢又不會(huì)影響到代碼的可測(cè)試性。希望這能給你的實(shí)際開(kāi)發(fā)帶來(lái)一定啟發(fā)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/28216.html

相關(guān)文章

  • PHP中的facade pattern(外觀模式)

    摘要:本文來(lái)自原文鏈接歡迎作客我們的學(xué)習(xí)群該篇屬于底層核心技術(shù)實(shí)戰(zhàn)揭秘這一課程底層核心概念解析這一章的擴(kuò)展閱讀??紤]到學(xué)員們的基礎(chǔ)差異,為了避免視頻當(dāng)中過(guò)于詳細(xì)而連篇累牘,故將一些底層實(shí)現(xiàn)相關(guān)的知識(shí)點(diǎn)以文章形式呈現(xiàn),供大家預(yù)習(xí)和隨時(shí)查閱。 本文來(lái)自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050該篇屬于《Laravel底層核心技術(shù)實(shí)戰(zhàn)...

    jaysun 評(píng)論0 收藏0
  • 外觀設(shè)計(jì)模式

    摘要:外觀設(shè)計(jì)模式的優(yōu)點(diǎn)易于使用在實(shí)現(xiàn)形式上通常占用較小的內(nèi)存。抽象的注意事項(xiàng)外觀設(shè)計(jì)模式雖然少有劣勢(shì),但值得注意的一個(gè)問(wèn)題是性能。 當(dāng)我們豎起一個(gè)門(mén)面時(shí),我們向外展示的只是一種外表,它可能隱藏著一個(gè)非同一般的事實(shí)。這也就是我們所要說(shuō)的外觀設(shè)計(jì)模式,這種模式為一大段的代碼體提供了一個(gè)便捷的高級(jí)接口,隱藏了底層復(fù)雜的實(shí)現(xiàn)。這種設(shè)計(jì)模式簡(jiǎn)化代碼的呈現(xiàn)形式,給開(kāi)發(fā)人員一個(gè)API,同時(shí)也能提高代碼的...

    zzbo 評(píng)論0 收藏0
  • 外觀模式(Facade Pattern)

    摘要:深入剖析,第二章。如果給方法以默認(rèn)訪問(wèn)權(quán)限,則只能在同一個(gè)包中訪問(wèn),這個(gè)被認(rèn)為是可以的,但是不最好,最優(yōu)雅的方式是通過(guò)類(lèi)。定義外觀模式,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。 《深入剖析Tomcat》(How Tomcat Works),第二章。 創(chuàng)建 Request 和 Response 分別實(shí)現(xiàn) ServletRequ...

    LMou 評(píng)論0 收藏0
  • Lumen 初體驗(yàn)(二)

    摘要:的現(xiàn)狀目前是版本,是基于開(kāi)發(fā)。入口文件啟動(dòng)文件和配置文件框架的入口文件是。在路由中指定控制器類(lèi)必須寫(xiě)全命名空間,不然會(huì)提示找不到類(lèi)。目前支持四種數(shù)據(jù)庫(kù)系統(tǒng)以及。使用時(shí)發(fā)生錯(cuò)誤,因?yàn)樵谖募?,的默認(rèn)驅(qū)動(dòng)是。 最近使用 Lumen 做了 2 個(gè)業(yè)余項(xiàng)目,特此記錄和分享一下。 Lumen 的介紹 在使用一項(xiàng)新的技術(shù)時(shí),了解其應(yīng)用場(chǎng)景是首要的事情。 Lumen 的口號(hào):為速度而生的 La...

    Cheriselalala 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<