走到這裡,才是我們iWriter真正的開始。哈哈,一切看起來如此的順利。iWriter是一個桌面程序,如Word、Photoshop一樣,當然iWriter要簡單得多,但也需要有界面讓用戶操作和使用文件來保存用戶的輸出。所以在桌面程序在開發上,一開始會面臨原型與文件的問題。原型嗎?天下文章一家抄,只需要將80%的操作控制到三步之內就可以了,詳細的就得另寫文章說明了。你願意等,我就願意寫。所以這裡更多的是說說文件格式的設計。當然你也可以在維基上看看別的格式的說明,只是在這裡我說得更簡單一點。
走到這裡,才是我們iWriter真正的開始。哈哈,一切看起來如此的順利。
經過一二個星期的學習,最於到了攻池略地的時候了。看看我們的夥伴,一個個勢氣如虹、威震山河,是時候大喊一聲」千秋萬載,一統江湖「了。
到了這一年,9102年,所有的軟體開發都需要原型,沒有原型我們程序猿是不會動手的。但我這裡不講原型設計,只提供了一張界面圖和功能的說明,讓我們知道我們要做的是什麼。這樣後面每一步,大家心裡有個底,」哦,這裡為了實現這個功能」。所以本章有三部分:
下面我們將從上述的三個方面來講講。
iWriter原型是我自己畫的,我說過我不僅是程序員,還是設計師。當然,這不能表明我一定畫得好,程序員、設計師都分一二三等的嘛。
整個布局分左中右三大區,目錄、備註、搜索欄共用左區,撰寫、大綱欄共用中區,角色、符號、字典欄共用右區;
iWriter的功能只是Word的極小部分,除了常規的文件讀寫,更多的是文字處理和一些覺得對寫小說有幫助的小功能。下面以界面為參考逐一說明。
文件格式一般分兩種:單文件與多文件格式,前都有PDF後者有EPUB。單文件格式,顧名思義是將所有的輸出數據保存在一個文件內;多文件格式,是將不同的輸出數據保存在不同的文件上,然後一起打包為一個文件。EPUB就是這麼乾的,大概地說是將整個靜態網站打包在一起。
由支持應用決定,iWriter需要保存的內容有:文件信息、目錄、角色、備註、符號、多個正文。
let info = [ "title":String, // 作品名 "author":String, // 作者,多個作者用逗號分開 "creation":Int, // 創建時間,時間戳,作身份 "chapters":String // 打開的章節,多個catalog->creation用逗號分隔 "activation":Int, // 當前編輯的章節,用 catalog->creation ... ]
3. catalog.txt,目錄。章節標題、章節信息、創建時間、章節字數、子集,JSON數據。
let catalog = [ [ "title":String, // 章節標題 "info":String, // 章節信息 "creation":Int, // 創建時間,時間戳,作身份 "number":Int, // 字數 "subset":[Any] // 子類別 ], ... ]
4. role.txt,角色。角色名、角色信息、創建時間,JSON數據。
let role = [ [ "name":String, // 名稱 "info":String, // 介紹 "creation":String, // 創建時間,時間戳,作身份 ], ... ]
5. symbol.txt,符號。符號名、符號信息、創建時間,JSON數據。
let symbol = [ [ "name":String, // 名稱 "info":String, // 介紹 "creation":String, // 創建時間,時間戳,作身份 ], ... ]
6. note.txt,備註。創建時間、備註內容。JSON數據。
let note = [ Int:String // 以時間戮為key, 以標內容為Value ... ]
7. "(creation)".txt,正文。
/** 標題:支持一二極標題對應章與節,快捷方式: # 一級標題 ;## 二級標題。 標註:支持標文本,快捷方式: * 標註 ; * 標註 *。 角色:支持插入角色,快捷方式:@ 角色。 無序:支持無序,快捷方式:$ 序列。 有序:支持有序,快捷方式:1. 序列,A. 序列,a. 序列,一. 序列。 刪除:支持顯示刪除文本,快捷方式:? 文本 ?。 臨時插入:支持顯示插入文本,快捷方式:^ 文本 ^。 **/
在一個項目啟動後,我們不僅需要原型,需要對功能進行梳理,更需要對整個項目的開發作有步驟有節點的計劃與規劃。 記得很早之前,Facebook有一句口號是「Done is better than perfect」,我們當時的翻譯是:「輸出高於一切」。在程序開發中,由於感知問題,不同時期對事物的感覺不一樣,而這種感覺大多是現在的大如從前。不用說是產品經理,就是自己,寫的代碼時,寫著寫著,回頭一看,多是「今是昨非」感覺,於是念念的想去改。這樣的行為導致的結果是,計劃落空,甚至無法輸出。改變這一狀況的方法是:用最短的時間做出確定的輸出。 所以編程不僅是技術問題,還是一個管理的問題,那怕是只有你一個人在作業。即然是管理問題,我們需要從細處著手。那該如何著手呢?即然標準是:用最短的時間做出確定的輸出。所以項目需要分階段,各個階段需要分節點,有計劃可檢測地輸出。對於程序開發來說,我們是這樣做的:首先,將程序功能按需求分階段, 如:基本的、適用的、優化的等,保證各階段的產品輸出。其次,在各個階段上,又要求按相關性分模塊實現功能。在按階段輸出的基礎上再按模塊逐一實現其功能,能保存在最短時間內輸出可量化、可檢測的結果。
在一個項目啟動後,我們不僅需要原型,需要對功能進行梳理,更需要對整個項目的開發作有步驟有節點的計劃與規劃。
記得很早之前,Facebook有一句口號是「Done is better than perfect」,我們當時的翻譯是:「輸出高於一切」。在程序開發中,由於感知問題,不同時期對事物的感覺不一樣,而這種感覺大多是現在的大如從前。不用說是產品經理,就是自己,寫的代碼時,寫著寫著,回頭一看,多是「今是昨非」感覺,於是念念的想去改。這樣的行為導致的結果是,計劃落空,甚至無法輸出。改變這一狀況的方法是:用最短的時間做出確定的輸出。 所以編程不僅是技術問題,還是一個管理的問題,那怕是只有你一個人在作業。即然是管理問題,我們需要從細處著手。
階段。
前面我們窮舉了iWriter的功能,作為一個給用戶用來創作小說的程序,功能實在不多。這對於一個團隊來說,一個階段可以把它們全部搞定,但對於我們獨立開發者來說,還是分階段、按模塊有計旬的輸出比較好。所以我將iWriter開發分為兩個階段:可用階段、好用階段。我們將一些體驗性的,冗餘的功能放到第二階:
模塊。
模塊的劃分與功能的相關性有關,這樣每一個模塊完成後都可以進行測試。獨立模塊需要優先完成,有依賴的模塊在有條件後再開始。功能測試和單元測試對於個人開發者來說尤其重要,我們沒有時間、金錢、精力去做大量的成品測試,所以把關好每一個環節能為我們省不少事情。就這樣,我把iWriter 按相關性劃分了功能模塊:
為了明天,為了功能模塊的輸出,今天我們要做好前期準備,我們又需要重建「iWriter」的macOS項目。嘿嘿,有點不好意思,但這是最後一次,這一次這個項目會陪我們到最後。
建好名為「iWriter」的macOS項目後,我們需要在Navigator Area中Project欄里iWriter群組下,再建六個群組,以便分類存放我們輸出的代碼。請留意,在舊版的Xcode里,這些新建的群組不會在文件夾里建立對應的目錄,而最新版本則可以了,很好,這個我喜歡。還有,目錄與文件的順序可以自己拖動排列:
如圖:
下一篇,文件模塊的實現。
讓我們在這裡,遇見明天的自己!姜友華