freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

swarm中文手冊(cè)-資料下載頁

2025-06-29 08:23本頁面
  

【正文】 MemoryZoneHere]。(create方法等同于createBegin/createEnd對(duì),如前所述)。下面將討論很多相關(guān)的例子,并將貫穿到Swarm的樣例程序中。有一點(diǎn)非常重要:Swarm中的對(duì)象能夠創(chuàng)建對(duì)象本身的實(shí)例。實(shí)例存在于內(nèi)存區(qū)域中,由Swarm庫管理。,最頂層的Swarm被創(chuàng)建在被稱為globalZone的內(nèi)存區(qū)域中,它是Zone類的實(shí)例。theTopLevelSwarm = [HeatbugObserverSwarm createBegin: globalZone]。globalZone是在Swarm程序一開始調(diào)用initSwarm函數(shù)時(shí)被創(chuàng)建的。隨后最頂層的Swarm被創(chuàng)建在globalZone中。任何類型為Swarm或者GUISwarm的對(duì)象都可以充當(dāng)內(nèi)存區(qū)域。在ModelSwarm中可以發(fā)現(xiàn):probeMap = [EmptyProbeMap createBegin: self]。上面的語句告訴EmptyProbeMap類在ModelSwarm分配的內(nèi)存區(qū)域中創(chuàng)建自己的實(shí)例對(duì)象,名字為probeMap。在swarm體系結(jié)構(gòu)頂層的對(duì)象(Swarm或GUISwarm)有權(quán)為對(duì)象創(chuàng)建它們可以生存于其中的空間。,首先是對(duì)象theTopLevelSwarm的創(chuàng)建,接著申請(qǐng)內(nèi)存的分配并設(shè)置需要在此期間初始化的重要變量的值。最后,剛剛被創(chuàng)建的對(duì)象需要連續(xù)執(zhí)行:[theTopLevelSwarm buildObjects]。[theTopLevelSwarm buildActions]。[theTopLevelSwarm activeIn: nil]。[theTopLevelSwarm go]??纯磘heTopLevelSwarm的buildObjects方法的內(nèi)部代碼,發(fā)現(xiàn)了什么?隨著Heatbugs代碼版本的不同,可能會(huì)發(fā)現(xiàn):heatbugModelSwarm = [HeatbugModelSwarm create:self]。在上面這句代碼中,self處于observer層,這意味著HeatbugModelSwarm將在observer提供的內(nèi)存區(qū)域創(chuàng)建名為heatbugModelSwarm的對(duì)象。,會(huì)發(fā)現(xiàn)createBegin命令,該命令初始化了很多實(shí)例變量和對(duì)象。這些對(duì)象都在內(nèi)存區(qū)域self中被創(chuàng)建,self是model swarm自己提供的空間。類型為SwarmObject的對(duì)象并非內(nèi)存區(qū)域,因此當(dāng)在繼承于SwarmObject的類中創(chuàng)建對(duì)象時(shí),必須有申請(qǐng)內(nèi)存的命令:bugPixmap = [Pixmap createBegin: [self geZone]]。在上面的語句中,但是對(duì)象所存在的內(nèi)存區(qū)域是由[self getZone]命令返回的。[self getZone將返回bug所在的內(nèi)存區(qū)域名字,即heatbugModelSwarm。 使用Swarm對(duì)象庫和頭文件在使用Swam中,對(duì)象的出現(xiàn)經(jīng)常顯得神出鬼沒?;蛘吒侠淼卣f,Swarm庫提供對(duì)象的方式往往不是那么明顯的。例如,假定想要?jiǎng)?chuàng)建一個(gè)對(duì)象列表,那么可以首先聲明一個(gè)名為listOfFriends的對(duì)象,然后創(chuàng)建對(duì)象列表。如下所示:id listOfFriends。listOfFriends = [List create: self]。在Swarm的樣例代碼中,經(jīng)??梢钥吹较裆厦孢@樣的代碼。List類哪里來的??一般來說,如果想要使用List類,對(duì)吧?對(duì)于很多Swarm類來說,由于不是要進(jìn)行子類化,因此無需顯式地包含相關(guān)的頭文件。相反,需要包含“通用目的”的頭文件,這些頭文件對(duì)應(yīng)了Swarm庫的主要部分。例如,要?jiǎng)?chuàng)建List對(duì)象,需要包含通用目的,該頭文件不僅包括List,還包括其他的集合類。“通用目的”的頭文件位于Swarm的include目錄下,計(jì)有:l l l l l l l l l 在《Swarm參考指南》中,可以看到很多協(xié)議都采用了CREATETABLE協(xié)議,這意味著用戶可以在自己的代碼中用它們創(chuàng)建對(duì)象。使用這些類時(shí),需要包含上述的頭文件之一。例如,要?jiǎng)?chuàng)建List對(duì)象。任何文件,只要是創(chuàng)建List、Map、Set或其他類型的集合對(duì)象,就必須包含該文件。(頭)(實(shí)現(xiàn))文件中必須將“通用目的”的頭文件包含進(jìn)去嗎?一般來說。唯一的例外是當(dāng)在頭文件中引用協(xié)議時(shí)。例如,如果想聲明一個(gè)采用List協(xié)議的對(duì)象,如:id List aList。,編譯器會(huì)通不過,并報(bào)告存在解析錯(cuò)誤。這是由于在該頭文件中找不到名為L(zhǎng)ist的類或者協(xié)議的定義,因此編譯器認(rèn)為這是一個(gè)編輯錯(cuò)誤。與之相反,如果頭文件使用的是一般性聲明,如:id aList。,僅在用戶類的實(shí)現(xiàn)文件中包含進(jìn)去就可以了。顯式地包含與某個(gè)類相關(guān)的頭文件僅當(dāng)要子類化該類時(shí)才需要。由于用戶的頭文件聲明了正在創(chuàng)建的用戶類,并引用了超類,因此在頭文件中必須包含與超類相關(guān)的所有頭文件。例如,SwarmObject是最常用到的超類。以上可歸結(jié)為兩條法則:l 如果用戶在自己的程序中使用了符合某種協(xié)議的類(例如List)來創(chuàng)建對(duì)象,則需要包含相關(guān)的通用頭文件。l 如果正在對(duì)遵守某個(gè)協(xié)議的類進(jìn)行子類化,還需要包含該類的頭文件。需要著重指出的是:并非所有的Swarm協(xié)議都允許被子類化。例如,為了避免某些難以克服的困難,List不能被用于創(chuàng)建用戶類。用戶可以創(chuàng)建List對(duì)象并使用之,但不能創(chuàng)建Swarm List類的變體來適應(yīng)自己項(xiàng)目的需要。作為良好的編碼習(xí)慣,代碼文件應(yīng)該保持清潔:每個(gè)文件只包含真正需要的頭文件。別把“所有的頭文件”都包含進(jìn)去。 其它的方法知道了對(duì)象是如何創(chuàng)建的,接下來要考慮的問題就是仿真程序是如何組織的。標(biāo)準(zhǔn)的Swarm程序采用這樣的方法:,可以是gui(圖形)或者batch(批處理)方式的swarm。然后在頂層swarm所在的內(nèi)存空間中創(chuàng)建model swarm。最后是model swarm依次創(chuàng)建組成用戶模型的各個(gè)對(duì)象。除此之外,還有很多種其它的方法可用于對(duì)象的創(chuàng)建。有些更符合直覺,有些則更易于“復(fù)用”。由于大部分讀者的第一個(gè)Swarm練習(xí)都是有關(guān)bugs項(xiàng)目的,因此在本文檔中,大部分Swarm樣例代碼都遵循bugs項(xiàng)目的約定。例如,在SimpleSwarmBug3中,: buildObjects { Bug *aBug。 int x, y。 [此處略去代碼若干行] bugList = [List create: self]。 for (y = 0。 y worldYSize。 y++) for (x = 0。 x worldXSize。 x++) if ([uniformDblRand getDoubleWithMin: withMax: ] bugDensity) { aBug = [Bug createBegin: self]。 [aBug setWorld: world Food: food]。 aBug = [aBug createEnd]。 [aBug setX: x Y: y]。 [bugList addLast: aBug]。}reportBug = [bugList removeFirst]。[bugList addFirst: reportBug]。return self。}上面的代碼在網(wǎng)格中循環(huán)創(chuàng)建bug對(duì)象。如果條件成立,會(huì)創(chuàng)建Bug類的實(shí)例對(duì)象,名為aBug,然后該實(shí)例被加到bugList中去??梢詫?duì)上面的代碼進(jìn)行某些修改以便更通用些。例如,創(chuàng)建一個(gè)新方法spawnOneBug,如下所示: buildObjects { Bug *aBug。 int x, y。 [此處略去代碼若干行] bugList = [List create: self]。 for (y = 0。 y worldYSize。 y++) for (x = 0。 x worldXSize。 x++) if ([uniformDblRand getDoubleWithMin: withMax: ] bugDensity) { [self spawnOneBug]。}reportBug = [bugList removeFirst]。[bugList addFirst: reportBug]。return self。} spawnOneBug{aBug = [Bug createBegin: self]。 [aBug setWorld: world Food: food]。 aBug = [aBug createEnd]。 [aBug setX: x Y: y]。 [bugList addLast: aBug]。 return self。}為什么這樣的修改會(huì)使代碼更通用呢?通過將創(chuàng)建bug對(duì)象并將之加到bugList的代碼提煉出來成為spawnOneBug方法,隨著時(shí)間的繼續(xù),往仿真中增加新的bug對(duì)象會(huì)更容易。 如何殺死那些可憐的小魔鬼?只要曾經(jīng)看過Swarm的樣例程序,肯定會(huì)遇到對(duì)象要被銷毀的情況。像index(索引)這樣的小“助手對(duì)象”,很容易使用如下的命令將之銷毀:[someIndexName drop]。如果一切順利的話,這會(huì)使得對(duì)象從內(nèi)存中消失,釋放相關(guān)的內(nèi)存。如果在仿真的過程中要?jiǎng)?chuàng)建和銷毀對(duì)象會(huì)怎么樣?在Swarm的教程中主要關(guān)注這樣的模型:程序的一開始就創(chuàng)建主體的群體,這些主體個(gè)體在程序運(yùn)行期間一直存在。如果想要對(duì)這樣的情況進(jìn)行建模會(huì)怎么樣:幸運(yùn)的HeatBug可以復(fù)制自身;在找尋既不太熱也不太冷之地的過程中,不幸運(yùn)的HeatBug會(huì)死去。Swarm的SugarScape模型是一個(gè)非常出色的樣例,展示了在持續(xù)模型中如何生成和銷毀主體的方法。,其中有一個(gè)名為addNewRandomAgent的方法,所起作用跟前面代碼中的spawnOneBug類似:創(chuàng)建并初始化SwarmObject類的對(duì)象。SSS還提供了方便的結(jié)構(gòu)用于殺死主體和用新的主體取代原先的主體,是一個(gè)三階段的過程。model swarm首先創(chuàng)建了一個(gè)List類對(duì)象reaperQueue。對(duì)于主體對(duì)象,如果發(fā)生了使得其生存值低于閾值的事件,則該對(duì)象將被通過agentDeath添加到reaperQueue中。reapAgents方法遍歷由已經(jīng)死亡的主體組成的列表reaperQueue,將這些主體從激活狀態(tài)的主體列表中移除,并通知上述主體將自己從內(nèi)存中銷毀。 agentDeath: (SugarAgent *)agent {[reaperQueue addLast: agent]。 if (replacement) // [self addNewRandomAgent]。 return self。 } //將在reaperQueue中所有的主體從agentList移除//這可以保證安全的銷毀主體。 reapAgents { id index, agent。 index = [reaperQueue begin: [self getZone]] 。 while ((agent = [index next])) { [agentList remove: agent]。 [agent drop]。 } [reaperQueue removeAll]。 [index drop]。return self。} 第八章 set和get語句面向?qū)ο蟮某绦蛟O(shè)計(jì)賦予程序員一種新的思維方式。對(duì)象維護(hù)自己的變量(實(shí)例變量,或者簡(jiǎn)寫為IVARs),而且,包含在實(shí)例變量中的信息是私有和自包含的。這有利于代碼的設(shè)計(jì),并且符合單個(gè)主體自治性的本質(zhì)。對(duì)象因此被或多或少地隔離起來了,這使得有些方面的編碼更容易,有些方面的編碼則更困難了。例如,在C語言中,可以在程序中的任何地方設(shè)置和修改變量值。而在像ObjectiveC這樣的面向?qū)ο蟪绦蛟O(shè)計(jì)語言中,如果編碼時(shí)具有良好的編程習(xí)慣,那么對(duì)象中的實(shí)例變量的值只有對(duì)象自己才能修改。后文將討論突破上述限制的一些方法,但總的來說,由對(duì)象自己來維護(hù)本身的數(shù)據(jù)是一個(gè)不錯(cuò)的想法。如果對(duì)象的數(shù)據(jù)是由本身維護(hù)的,那么我們?nèi)绾喂芾鞸warm項(xiàng)目中的信息呢?在Swarm開發(fā)的早期,開發(fā)者采用如下的約定(與Objective C、Java、Smalltalk以及其它許多面向?qū)ο笳Z言的慣例相同):名字開頭是set的方法,被用來設(shè)置對(duì)象中變量的值,如setIdealTemperature或setAge;名字開頭是get的方法,被用來獲取對(duì)象中變量的值,如getIdealTemperature或getAge。 Get和Set方法Get和Set方法被用來在對(duì)象之間傳遞信息。以Heatbugs為例。,有設(shè)置和獲取bug對(duì)象中信息的方法。例如,setIdealTemperature: setIdeaTemperature: (HeatValue)i{ idealTemperature = i。 return self。}Heatbug對(duì)象有一個(gè)名為idealTemperature的實(shí)例變量,上面的方法可用于設(shè)置該變量的值。如果某個(gè)其他的對(duì)象要知道heatbug的理想溫度是多少,應(yīng)該怎么辦?,如下所示: (double) getIdealTemperature{ return idealTemperature。}建議大家盡可能的用這種方式交換信息。因而,如果observer swarm需要包含所有主體的主體列表來創(chuàng)建圖形,那么就應(yīng)該為model swarm增加一個(gè)方法如getAgentList,以返回observer swar
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1