對象之間的交互

  之前寫過一篇隨筆《剪刀剪紙》是給一些新同事講面向對象時用的,當時就感覺有些不順暢,不過用來給新同事入門足夠了就沒多想,最近看書時偶爾走神把這件事想起來了,順便群里討論時談到聚合之間的方法調用,于是決定寫一篇博客糾正一下那篇隨筆里的問題。

  開頭先聲明一下,以下只是個例子,只是用來說明對象間交互的解耦,怎么樣交互我覺得更好,但是如果是真的要寫一個剪刀剪紙的程序,之前隨筆的做法并不一定就是不好的,有些耦合只是在需要解的時候才應該去解。另外,以下做法只是理想的做法,但是現實的項目總會有各種各樣的妥協,所以主要還是隨機應變,沒有最好的做法,只有最合適的做法,聲明暫時結束。

  在剪刀剪紙的隨筆里寫了:剪刀只需要關心自己發出了剪的動作,不需要關心紙,于是給紙抽象了一個東西的基類。但是回頭細看其實這并沒有解決問題,剪刀雖然沒有和紙發生耦合,但是和東西發生了耦合,剪刀本身并不一定要剪東西,說不定就是個工藝品呢,剪刀剪紙隨筆中剪子的Cut(Thing thing)方法參數選擇了Thing等于將剪刀內部的邏輯對Thing公開了一部分,這種做法已經破壞了剪子的封裝,同時也表達了一種業務邏輯,既剪刀剪東西,而且Thing也已經不是單純的東西的概念,而是被剪子剪的東西。如果是一個初學者做項目,這么做問題或許不大,但是深究這種做法從某種角度來說是錯的。

  上面一段說出的問題概括一下:

  1.剪刀和Thing(以下所說的Thing都代表”被剪的東西“這個概念)的耦合是多余的,如何讓剪刀和Thing各自獨立;

  2.在需要的時候,剪子和Thing可以交互完成剪東西這一業務。

  上面說了Cut的參數使用Thing破壞了封裝,如果做好封裝的話就可以解決上面的第一個問題。做好封裝也就是說剪刀只包含自己的職責,也就是抽象好自己的職責,封裝和抽象是相輔相成的存在。仔細思考下,剪子的職責應該是什么的,可以用來剪東西只是說明了它可以做什么,諾基亞還可以用來砸核桃(其實還有用來開核桃的模特模型,你懂得。。。),但你能說砸核桃是諾基亞的職責么,那剪刀的職責是什么,很明顯沒Thing那就一定是剪了,怎么表達這個剪呢,那就是發出一個剪的作用力,所以,我們可以增加一個作用力的對象,當然如果非要較真,作用力和剪刀還是有耦合,不過剪刀本就是接受并傳遞作用力的,作用力只是參數,而且作用力在這個業務場景中也是在一個工作單元里傳遞業務狀態變化的根本,整個業務其實就是由作用力驅動的,其實這個作用力用命令模式的命令來表達或許更貼切,不過這里就不細說了。

?

    //關于命名,我是故意的,原因不想說,你們千萬別學,作用力的意思public class KineticEnergy{public int Size { get; set; }public struct Point{public int X { get; set; }public int Y { get; set; }}}

?  然后是剪刀的:

    public class Scissors{private KineticEnergy _kineticEnergyBeUsed { get; set; }public void Stress(KineticEnergy kineticEnergy){_kineticEnergyBeUsed = kineticEnergy;}public KineticEnergy SendCutEnergy(){return SwitchKineticEnergy();}private KineticEnergy SwitchKineticEnergy(){KineticEnergy kineticEnergyBeCut = _kineticEnergyBeUsed;//作用點和力的大小等變化return kineticEnergyBeCut;}}

  至于Thing還是看剪紙那篇隨筆的,基本就是那意思,代碼就不改個名重貼一遍這么費事了。

  下面就是第二個問題了,想必大家也看出來了,第二個問題基本上也不是問題了,剪刀剪一次紙的過程我們可以用一個工作單元來表示(我偷懶,傳遞的力一直在改變,但是反正重點不在這,就不要在意這些細節了):

    //工作單元UOW三個單詞不是這么寫的,看到的注意,別學!!!public class CutThingsWorkUnit{private KineticEnergy _kineticEnergy;private Scissors _scissors;private Thing _thing;//剪刀和Thing應該由業務場景的Context來提供public CutThingsWorkUnit(Scissors scissors, Thing thing){_scissors = scissors;_thing = thing;}public void Execute(){//這里的人,那篇隨筆我已經給抽象掉了,放這里就是個意思,隨便實例化一下,這種細節就不要在意了Person person = new Person();_kineticEnergy = person.UseScissorsKineticEnergy();_scissors.Stress(_kineticEnergy);_kineticEnergy = _scissors.SendCutEnergy();_thing.Stress(_kineticEnergy);}}

  最后,至于這東西被剪的結果,剪紙那篇隨筆說過,就不再說了。

?

  

?

?

?

?

轉載于:https://www.cnblogs.com/saaav/p/3763735.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375826.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NewCode----數串

題目描述: 設有n個正整數,將他們連接成一排,組成一個最大的多位整數。 如:n3時,3個整數13,312,343,連成的最大整數為34331213。 如:n4時,4個整數7,13,4,246連接成的最大整數為7424613。 輸入描述: 有多組測試樣例&#xff0c…

計算機跨專業專插本學音樂,歡迎投稿丨專插本可以跨專業考,只要肯堅持!

點擊上方△藍字可關注我們昵稱E師姐性別女插本復習資料教材、小紅書、CB398、啟航等插本關注的公眾號、網站等介紹微信公眾號居多:專插本資料庫、專插本直通車、廣東省專插本、插本最前線等等……專科學校和專業廣州城市職業學院 會計插本學校和專業廣東財經大學華商…

Android,監控ContentProvider的數據改變

有時候應用中需要監聽ContentProvider的改變并提供響應,這時候就要利用ContentObserver類了 不管是ContentProvider中實現的,insert,delete,update方法中的任何一個,程序都會調用getContext().getContentResolver().notifyChange(uri,null); 這行代碼可用…

[leetcode]Sort List

題目要求:Sort a linked list in O(n log n) time using constant space complexity. 數據結構定義: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : v…

北京市中 高英語聽說計算機考,2021年北京高考首次英語聽說機考時間確定,共五種題型...

從明年開始,北京市高考統考英語科目增加口語考試,連同之前的聽力考試一起,實行一年兩考。今天,北京教育考試院發布消息,2021年高考英語聽說計算機考試首考將于2020年12月12日進行。12月7日起,考生可登陸北京…

NewCode----彩色寶石項鏈

題目描述: 有一條彩色寶石項鏈,是由很多種不同的寶石組成的,包括紅寶石,藍寶石,鉆石,翡翠,珍珠等。有一天國王把項鏈賞賜給了一個學者,并跟他說,你可以帶走這條項鏈,但是…

插件開發-UI插件開發

1.新建類庫解決方案,引入命名空間,同時引入要添加UI Form的WebPart(在Portal\UILib目錄下)2.繼續UFSoft.UBF.UI.Custom.ExtendedPartBase,重寫AfterInit()方法,代碼如下,便于添加下拉列表按鈕,在原單據中UI先新增一下拉…

為博客園選擇一個小巧霸氣的語法高亮插件

博客園的語法高亮簡直蛋疼,于是乎就打算找一個靠譜的插件來改造下。各種百度谷歌,大致得到幾個推薦:SyntaxHighlighter,Snippet,Google Code Pretiffy,Highlight,SHJS。其實 SyntaxHighlighter …

計算器軟件設計和計算機軟件設計區別,求一個模擬計算器程序

# include# include# include# include# define MAX_OPERATOR_NUM 100//運算符棧數組長度# define MAX_DATA_NUM 100//運算數棧數組長度typedef struct OPStack//定義運算符棧{char opStack[MAX_OPERATOR_NUM];int top;}OPStack, *pOPStack;typedef struct DATAStack//定義操作…

python中print語句

學習鏈接1 學習鏈接2 1. 如果print語句后面什么符號都沒有是個換行語句,也就是是要另起一行。 2. 分號表示下次輸出是緊挨著這個光標位置輸出. 3. 而逗號是下次輸出與這次輸出有一定的空格之后接著輸出. namekk salutationMr. greetingHello, print greeting,sa…

計算機應用基礎論壇貼子怎么發,網絡課程論壇中長尾現象的應對策略——以《計算機應用基礎》網絡課程為例...

摘要:進入21世紀以來,互聯網就備受關注.由于我國信息設施資源建設穩步推進,互聯網的基礎更為堅實,發展更為迅速.據權威數據統計,中國至2009年約擁有130萬個BBS論壇,數量為全球第一,然而,作為分享和參與類應用的典型代表(更新博客,發帖/回帖)的使用率仍然偏低.筆者在…

解析Json需要設置Mime

IIS6.0 1.打開IIS添加Mime項 關聯擴展名:*.json內容類型(MIME):application/x-javascript 2.添加映射: 位置在IIS對應站點右鍵屬性:”主目錄”-”應用程序設置”-”配置”-”映射”-”添加”,會打開”添加/編輯應用程序…

Using the Transient Fault Handling Application Block

http://msdn.microsoft.com/en-us/library/dn440719(vpandp.60).aspx轉載于:https://www.cnblogs.com/fengye87626/p/3772555.html

讓python腳本像普通程序一樣運行

有些時候像運行其他程序一樣運行python程序(也叫做腳本),而不是顯式使用python解釋器。在UNIX中有個標準的實現方法:在腳本首行前面加上#!(叫做pound bang或者shebang),在其后加上用…

Function類型(JS高程3)—— JS學習筆記2015-6-29(第70天)

Function 類型 函數是對象 具有屬性和方法,函數名實際上是一個指向函數對象的指針 沒有重載; 函數聲明和函數表達式 函數聲明: function sum (num1, num2){ return num1 num2; } 函數表達式: var sum function(num1, num2){ ret…

PS圖片刪除需要計算機管理權限,如何使用PsTools工具執行本地/遠程PC管理任務

大多數剛入門的管理員都習慣使用 RDP 或其它類似的工具連接到遠程 Windows 中進行圖形化管理。而 PowerShell 及 PsTools 等工具可以幫助我們在命令行中執行相當多的管理任務,更主要的是可以將其寫成腳本來執行周期性重復任務或在管理大批量服務器時提高效率。在企業…

LeetCode:Spiral Matrix I II

Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 打印螺旋矩陣 逐個環…

TCP為什么需要三次握手和四次揮手

網上已經有很多解釋了,就不瞎說了,Mark一些鏈接作為自己的學習筆記吧。 學習參考鏈接1 學習參考鏈接2 學習參考鏈接3 學習參考鏈接4 為什么要3次握手 防止已過期的連接請求報文突然又傳送到服務器,因而產生錯誤。 Client發生一個請求連…

不屬于個人計算機范圍的是,計算機應用基礎模擬試卷2

一、1.單項選擇題單項選擇題每小題1分。在每小題列出的四個備選項中只有一個是符合題目要求的,請將其選出并將“答題卡”的相應代碼涂黑。未涂、錯涂或多涂均無分。0. 個人計算機屬于A.小巨型機B.小型計算機C.微型計算機D&#xf…

Python實驗:關燈游戲

文章目錄 前言一、設計表二、關鍵代碼三、運行結果小地圖,容易難度:中地圖,中等難度:大地圖,困難難度: 四、完整代碼鏈接總結 前言 這是一個Python實驗作業,內容如下: 題目要求&am…