本文介紹一種「邏輯持久化技術」。目的是進一步提高代碼複用程度。主要應用場景在遊戲中,例如人物角色升級、事物隊列冷卻等。前端
開發遊戲中,常常看到一些業務邏輯類似,可是又沒法複用的代碼。例如升級。react
英雄:每100點經驗升級1級。程序員
騎寵:每100點經驗升級1星,每12星升級一級。數據庫
若是用傳統的設計思路,會獲得如下代碼片斷:編程
USR_HERO { public int exp; public int level; } UsrHeroDao { public boolean upgrade( USR_HERO hero, int exp) { hero.exp += exp; if (hero.exp >= MAX_EXP) { hero.exp = MAX_EXP - hero.exp; hero.level += 1; } } }
若是是寵物,就寫一套寵物的升級代碼。這種代碼開發多了,就開始以爲煩,可是不認真看又會出Bug。咱們程序員尼瑪怎麼能天天都重複的幹着這些無聊的事情??後端
因而我開始左思右想,若是這些能力是模塊,一個對象安裝了這個模塊,就具有了升級的能力,那我就不用開發了啊。多爽??不斷的左思右想,曾經還半夜在家裏的大廳摸黑轉來轉去,大腦不斷構造着各類架構,又不斷的被推翻。架構
終於,有一天, 我走在回家的路上的時候,給我想到了!!!app
(PS: 各位看解決方案的時候,也能夠稍微1分鐘思考下上面的問題)this
首先要分析爲何代碼不能複用。由於升級的經驗值是值類型對象!這個就是一切的根源本質。能夠想象下,若是把對象的經驗、等級放入方法內運算,實際上對象的值是沒有受到影響的,由於按值傳遞被拷貝了一份。spa
因此???把值類型轉成對象類型,忽然間一切都柳暗花明了。例如:
OrmInt { public int value; } USR_HERO { public OrmInt exp; public OrmInt level; }
看到這裏,你們是否忽然間明白了?忽然間以爲高端大氣上檔次了?尼瑪這但是我奮戰幾天的結果。我相信我不說,業界起碼3年內不會有人往這個方向思考(臭美一下,各位大俠手下留情,千萬別噴我。。。。。)
如今我把升級的方法修改一下:
UsrHeroDao { public boolean upgrade(OrmInt exp, OrmInt level, int exp) { exp.value += exp; If(exp.value >= MAX_EXP) { exp.value = MAX_EXP - exp; level.value += 1; } } }
怎樣?是否是以爲爽了不少。
爲了進一步說明這個「邏輯持久化」如何的高端,我舉個我實際使用的例子, 使用了簡化代碼:
// 爲OrmInt增長一個可升級的方法,返回升級對象。 OrmInt { public OrmUpgradable ugprade(OrmInt upgradeValue, OrmUpgradeLimit upgradeLimited) { OrmUpgradable value = new OrmUpgradable(this, value, ugpradeLimited); } } // 升級對象,支持鏈式編程,實現升級觸發下一升級的效果 OrmUpgradable { private OrmInt value; // 被升級的對象 private OrmInt upgradeValue; // 當前升級的值 private OrmUpgradeLimit upgradeLImited; // 升級的上限對象 private OrmUpgradable head; // 鏈式升級的頭 private OrmUpgrade child; // 鏈式升級的尾 // 觸發下一個升級 public OrmUpgradable upgrade(OrmInt value, OrmInt upgradeValue, OrmUpgradeLimit upgradeLimited) { OrmUpgradable orm = new OrmUpgradable(value, upgradeValue, upgradeLimited); orm.head = this.head; this.child = orm; return orm; } // 開始升級 public boolean doWhile() { // 不斷循環升級 if(this.value.greatThan(0)) { // 當前的升級上限 int upgradeLimited = this.upgradeLimited.getUpgradeLimit(); // 計算可升級的值的部分 並升級 int incValue = min(upgradeLimited.substract(this.value), upgradeValue); this.value.increase(incValue); //判斷是否升級 if(this.value.greatEqualThan(upgradeLimit)) { // 鏈式觸發後續的升級 if(!this.child.doWhile()) return true; } // 更新剩餘可升級部分 upgradeValue.update(upgradeValue.substract(incValue)); this.value.update(0); } return true; } }
使用方法:
p.value.upgrade(11, 10)
.upgrade(p.value2, 1, 10)
.upgrade(p.value3, 1, 10)
.doWhile()
這段代碼用起來簡單,可是原理有點複雜。
本文拋磚引玉,介紹了一種很是強大的「業務邏輯持久化」技術。本質就是值類型轉對象類型;對象類型除了包含數據外,並帶上處理方法。
這樣,這個對象複製給了Orm,Orm就具有了對應的能力。因此我命名爲「業務邏輯持久化」,由於我把邏輯放在了持久層。
實際上如今的業務邏輯操做,都是圍繞着數據。
邏輯更確切的說,就是圍繞相互有關聯的數據字段進行邏輯操做。 思惟發散下,就明白。這個已經不是對某個對象進行操做了。
英雄有經驗等級、坐騎也有經驗等級,可是升級這個操做其實是針對經驗和等級這2個數據創建關係,而不是英雄和坐騎。
這個技術國外叫作:functional reactive programming
Hudak, Paul (September 1989). "Conception, evolution, and application of functional programming languages" (PDF). ACM Computing Surveys 21 (3): 359–411. doi:10.1145/72551.72554.
領先業界3年的遊戲開發技術——頂級數據庫持久層的設計。
目前最流行的數據庫持久層是什麼?Hibernate?ADO.NET?不,Hibernate從出生開始,我就以爲他實在太落後了。歡迎關注6月份的主題——頂級數據庫持久層設計。
咱們來自Pixysoft獨立遊戲製做人。咱們的目標是培養早就遊戲行業的獨立製做人,提供一切相關的技術文檔資料,從前端到後端、策劃、數值、美術全方位進行培養。
歡迎加入咱們的羣:95755843
本羣每個月1日~10日爲開放日,不限條件加入。11~30日爲閉關日,除了成員邀請外,不對外開放,進行封閉培訓。
本羣關注的是思想的交流,其次藉助開源平臺共享資源。
歡迎遊戲愛好者加入。