欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
什么是閉包,我的理解

  首先,我覺(jué)得,一個(gè)概念,如果不理解也不影響使用的話(huà),那么,就沒(méi)必要去理解它、去學(xué)習它。閉包就是這樣一個(gè)概念,你不理解它也能很好的用它。俺這兩年寫(xiě)as3程序,是天天在和它打交道,甚至有過(guò)一個(gè)function套一個(gè),一個(gè)方法中套了20多個(gè)function的極端例子,但從未深究過(guò)它是怎么實(shí)現的,它就像水和空氣一樣,我們不需要知道水是H2O,空氣是氧氣氮氣二氧化碳等的混合物,也活的好好的。

  其次,我覺(jué)得,網(wǎng)上對閉包概念的解釋都太狹隘了,看得人蛋疼,就像回到了i++,++i時(shí)代一樣。如果非要去理解這個(gè)概念,像那樣去理解,則收獲太小,不值得。

  維基百科上對閉包的解釋就很經(jīng)典:

在計算機科學(xué)中,閉包(Closure)是詞法閉包(Lexical Closure)的簡(jiǎn)稱(chēng),是引用了自由變量的函數。這個(gè)被引用的自由變量將和這個(gè)函數一同存在,即使已經(jīng)離開(kāi)了創(chuàng )造它的環(huán)境也不例外。所以,有另一種說(shuō)法認為閉包是由函數和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。

Peter J. Landin 在1964年將術(shù)語(yǔ)閉包定義為一種包含環(huán)境成分和控制成分的實(shí)體。

  下面是我理解的閉包概念。

  先看看數學(xué)上的閉包。

  (1,5) 是一個(gè)區間,但對這個(gè)區間做分析、計算什么的,經(jīng)常會(huì )用到1和5這兩個(gè)不屬于這個(gè)區間的值,[1,5]就是(1,5)的閉包。

  在生活上,我們辦事情,找A部門(mén),A部門(mén)說(shuō),你先得找B部門(mén)蓋個(gè)章,B部門(mén)說(shuō),你先得找C部門(mén)蓋個(gè)章,C部門(mén)說(shuō),這個(gè)東西不是我們的職權范圍…… 踢皮球,這就是非閉包。閉包就是負責到底,你找到A部門(mén),A部門(mén)接待的那個(gè)人負責到底,他/她去協(xié)調B部門(mén)和C部門(mén)。

  在工程上,閉包就是項目經(jīng)理,負責調度項目所需要的資源。老板、客戶(hù)有什么事情,直接找項目經(jīng)理即可,不用再去找其它的人。

  在程序語(yǔ)言中,閉包就是一種語(yǔ)法糖,它以很自然的形式,把我們的目的和我們的目的所涉及的資源全給自動(dòng)打包在一起,以某種自然、盡量不讓人誤解的方式讓人來(lái)使用。至于其具體實(shí)現,我個(gè)人意見(jiàn),在不影響使用的情況下,不求甚解即可。在很多情況下,需要在一段代碼里去訪(fǎng)問(wèn)外部的局部變量,不提供這種語(yǔ)法糖,需要寫(xiě)非常多的代碼,有了閉包這個(gè)語(yǔ)法糖,就不用寫(xiě)這么多代碼,自然而然的就用了。

  這樣一來(lái),可以把閉包從一個(gè)語(yǔ)法機制提升為一種設計原則

閉包是從用戶(hù)角度考慮的一種設計概念,它基于對上下文的分析,把齷齪的事情、復雜的事情和外部環(huán)境交互的事情都自己做了,留給用戶(hù)一個(gè)很自然的接口。

  在這個(gè)原則下,函數式語(yǔ)言中,那種所謂的閉包只是一種“閉包”,還有大量的其它類(lèi)型的“閉包”等待發(fā)現和實(shí)現。

  下面舉出一些閉包設計原則的正例和反例。

  正例:

  Flex中的數據綁定語(yǔ)法就是一種“閉包”。x="{b.num + c.num}",對于這個(gè)語(yǔ)法,編譯器自動(dòng)去上下文中尋找叫 b 和 c 的變量,然后再找他們內部 num 變量,如果他們都是可綁定的話(huà),則自動(dòng)給它們添加上綁定鏈,當 b, c, num 等有任一變動(dòng)時(shí),更新 x 的值。

  反例:

  Winform 中的設計就違反了閉包原則,當不是在該UI線(xiàn)程中,更新某些控件的值時(shí),會(huì )拋出異常。只能去invoke調用,而invoke的接口很難用,相信很多人對這東東極其反感。

  閉包不一定是語(yǔ)法糖。當我們不能直接擴展編譯器時(shí),我們就無(wú)法增加語(yǔ)法糖來(lái)實(shí)現閉包機制,這時(shí),就要用現有的語(yǔ)言機制來(lái)實(shí)現了。

  下面,我們來(lái)對winform的invoke方法進(jìn)行改造,使它滿(mǎn)足閉包原則。下面是代碼:

    public class ControlFuncContext 
{
public Control Control { get; private set; }
public Delegate Delegate { get; private set; }
public ControlFuncContext(Control ctl, Delegate d)
{
this.Control = ctl;
this.Delegate = d;
}
public void Invoke0()
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke();
}
catch(ObjectDisposedException ex)
{
}
}
}
public void Invoke1<T>(T obj)
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke(obj);
}
catch (ObjectDisposedException ex)
{
}
}
}
public void Invoke2<T0,T1>(T0 obj0, T1 obj1)
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke(obj0, obj1);
}
catch (ObjectDisposedException ex)
{
}
}
}
}
public static class FormClassHelper
{
public static void InvokeAction(this Control ctl, Action action)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action(fc.Invoke0));
}
}
public static void InvokeAction<T>(this Control ctl, Action<T> action, T obj)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action<T>(fc.Invoke1<T>), obj);
}
}
public static void InvokeAction<T0, T1>(this Control ctl, Action<T0, T1> action, T0 obj0, T1 obj1)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action<T0, T1>(fc.Invoke2<T0, T1>), obj0, obj1);
}
}
}

  使用起來(lái)很簡(jiǎn)單,直接調用擴展方法 InvokeAction 即可,不必去考慮跨線(xiàn)程還是不跨線(xiàn)程這些“環(huán)境因素”,跨線(xiàn)程調用,我們已經(jīng)通過(guò)用戶(hù)不必知曉的方式,把它封裝起來(lái)了。

  再舉個(gè)例子,寫(xiě)程序經(jīng)常需要這樣一個(gè)功能:打開(kāi)一個(gè)圖像文件,然后進(jìn)行處理。正常寫(xiě)法很麻煩,比如,那個(gè)filter格式就很容易忘記,那么,我們就把它閉包化,把不該讓用戶(hù)知道,不該讓用戶(hù)敲鍵盤(pán)的都給它封裝起來(lái):

public static void OpenFile(this Form element, Action<String> callbackOnFilePath, String filter = "所有文件|*.*")
{
String filePath;
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = filter;
dlg.FileOk += (object sender, CancelEventArgs e) =>
{
filePath = dlg.FileName;
    if (callbackOnFilePath != null)
callbackOnFilePath(filePath);
};
dlg.ShowDialog();
}
public static void OpenImageFile(this Form element, Action<String> callbackOnFilePath, String filter = "圖像文件|*.bmp;*.jpg;*.gif;*.png")
{
OpenFile(element, callbackOnFilePath, filter);
}

  再舉一個(gè)例子,這個(gè)例子是as3中的。在Flex中,控件有一個(gè)callLater 方法,在下一幀時(shí)進(jìn)行調用。這個(gè)方法非常有用,很多時(shí)候,非Flex項目也需要這樣的一個(gè)方法。下面,我們進(jìn)行模擬:

package orc.utils 
{
import flash.display.Stage;
import flash.events.Event;
public class CallLaterHelper
{
public function CallLaterHelper(stage:Stage, callback:Function)
{
this.callback = callback;
this.stage = stage;
stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame);
}
private var stage:Stage;
private var callback:Function;
private function onStageEnterFrame(event:Event):void
{
stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame);
if(callback != null)
{
callback();
}
}
}
}

  然后在基礎控件中,提供callLater方法:

public function callLater(callback:Function):void 
{
new CallLaterHelper(this.stage,callback);
}

  總結:

 ?。?)閉包是一種設計原則,它通過(guò)分析上下文,來(lái)簡(jiǎn)化用戶(hù)的調用,讓用戶(hù)在不知曉的情況下,達到他的目的;

 ?。?)網(wǎng)上主流的對閉包剖析的文章實(shí)際上是和閉包原則反向而馳的,如果需要知道閉包細節才能用好的話(huà),這個(gè)閉包是設計失敗的;

 ?。?)盡量少學(xué)習。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
如何重載delegate
java反射機制與動(dòng)態(tài)代理(三)
Unity3D RTS游戲中幀同步實(shí)現
設計模式--代理模式 - 設計模式
利用java反射調用類(lèi)的的私有方法
別裝了-第一集:代理模式、動(dòng)態(tài)代理和面向方面 - 別裝了!大家一起來(lái)魯棒啦!-loobong - JavaEye技術(shù)網(wǎng)站
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久