走到這裡,才是我們iWriter真正的開始。哈哈,一切看起來如此的順利。

iWriter是一個桌面程序,如Word、Photoshop一樣,當然iWriter要簡單得多,但也需要有界面讓用戶操作和使用文件來保存用戶的輸出。所以在桌面程序在開發上,一開始會面臨原型與文件的問題。原型嗎?天下文章一家抄,只需要將80%的操作控制到三步之內就可以了,詳細的就得另寫文章說明了。你願意等,我就願意寫。所以這裡更多的是說說文件格式的設計。當然你也可以在維基上看看別的格式的說明,只是在這裡我說得更簡單一點。

經過一二個星期的學習,最於到了攻池略地的時候了。看看我們的夥伴,一個個勢氣如虹、威震山河,是時候大喊一聲」千秋萬載,一統江湖「了。

????? 概述 ?????

到了這一年,9102年,所有的軟體開發都需要原型,沒有原型我們程序猿是不會動手的。但我這裡不講原型設計,只提供了一張界面圖和功能的說明,讓我們知道我們要做的是什麼。這樣後面每一步,大家心裡有個底,」哦,這裡為了實現這個功能」。所以本章有三部分:

  1. 原型與功能:有了原型,我們才知道需要那麼組件;有了功能說明,我們才知需要處理什麼樣的業務,所以原型是開發的基準。
  2. 文件格式:想在這裡說,不僅是因為跟業務有關係,同時是因為我以前折騰過。不希望我的夥伴再折騰一次,所以說一說。
  3. 開發說明:為下步的將要實現的功能模作一個計劃,因為程序開發不僅僅是寫代碼,它還是一項工程管理,得有計劃地去做這件事情。

下面我們將從上述的三個方面來講講。

????? 正文 ?????

一、「iWriter」 原型與功能:

iWriter原型是我自己畫的,我說過我不僅是程序員,還是設計師。當然,這不能表明我一定畫得好,程序員、設計師都分一二三等的嘛。

  • 原型與布局說明

整個布局分左中右三大區,目錄、備註、搜索欄共用左區,撰寫、大綱欄共用中區,角色、符號、字典欄共用右區;

  1. 各欄點擊標題區域可展開或收攏該欄內容,拖動區間線可改變相鄰區區域,拖動欄間線可改變相鄰欄欄區域。
  2. 撰寫欄可拖動章節標題,以調整章節在該欄中的順序。
  • 界面功能說明。

iWriter的功能只是Word的極小部分,除了常規的文件讀寫,更多的是文字處理和一些覺得對寫小說有幫助的小功能。下面以界面為參考逐一說明。

  1. 最近打開小說:
    1. 點擊顯示下拉窗口。
    2. 窗口列表按時間近遠顯示最近撰寫的作品,顯示數量讀取用戶設置的相關參數,初始默認值為10。
    3. 點擊列表項,打開該作品,實現了作品的快速切換。
  2. 工具欄:
    1. 新建:顯示文件瀏覽器窗口,用戶指定文件名稱與保存位置,確定後開始新的章節。
    2. 打開:顯示文件瀏覽器窗口,用戶指定文件,確定後開始上次編輯的章節。
    3. 保存:將新編輯的內容保存到指定文件中。
    4. 標題:支持一二極標題,分別對應章與節。快捷方式: # 一級標題 ;## 二級標題。
    5. 標註:支持標註文本。快捷方式: * 標註 ; * 標註 *。
    6. 角色:支持插入角色。快捷方式:@ 角色。
    7. 無序:支持無序列表。快捷方式:$ 序列。
    8. 有序:支持有序列表。快捷方式:1. 序列,A. 序列,a. 序列,一. 序列。
    9. 刪除:未選擇文本時支持顯示隱藏、刪除的文本。選擇文本時,為所選文本添加刪除線。快捷方式:? 文本 ?。
    10. 臨時插入:未選擇文本時支持顯示隱藏、臨時插入的文本。選擇文本時,為所選文本添加臨時插入標誌,快捷方式:^ 文本 ^。
  3. 作業信息:顯示全文字數,本節字數,當天字數,當天任務字數,未完成數,當天已作業時長等。當天作務數量讀取用戶設置的相關參數,初始默認值5000。
  4. 目錄:
    1. 目錄導航。
    2. 點擊右側「+」,添加章節,設置目錄名、說明。
    3. 雙擊目錄項可編輯該項目錄名及說明。
    4. 選擇目錄項,可用Delete鍵刪除該項。
    5. 可拖移目錄項進行排序。
    6. 支持右鍵:目錄名編輯、說明編輯、刪除、上移、下移。
  5. 備註:
    1. 備註導航。
    2. 選擇文本後,點擊右側「+」,顯示輸入框,輸入添加備註。
    3. 雙擊備註項可編輯該項。
    4. 選擇備註項,可用Delete鍵刪除該項。
    5. 支持右鍵:編輯、刪除。
  6. 搜索:
    1. 輸入搜索關鍵詞,確認後可檢索導航。
    2. 輸入替換關鍵詞,可單個替換和全部替換。
    3. 勾選全文,實現全文範圍中使用。
    4. 文本中,對應搜索關鍵詞顯示高亮,突出當前導航位置的關鍵詞。
  7. 角色:
    1. 角色導航(時間線)。
    2. 占擊右側「+」,添加角色,設置角色名,說明,支持角色名自動生成。
    3. 雙擊角色項可編輯該項角色名及說明。
    4. 選擇角色項,可用Delete鍵刪除該項。
    5. 可拖移角色項進行排序。
    6. 支持右鍵:角色名編輯、說明編輯、刪除、上移、下移。
  8. 符號,可將行文中常出現的片語定義為符號,如「降龍十八掌」、「風波亭」等。
    1. 符號導航(時間線)。
    2. 占擊右側「+」,添加符號,設置符號名,說明。
    3. 雙擊符號項可編輯該項符號名及說明。
    4. 選擇符號項,可用Delete鍵刪除該項。
    5. 可拖移符號項進行排序。
    6. 支持右鍵:符號名編輯、說明編輯、刪除、上移、下移。
  9. 字典:字、詞、成語查詢釋義功能。
  • 其它程序功能:
  1. iwriter菜單:
    1. 關於:檢查更新。
    2. 偏好設置:多語言設置,前期中英文;默認值設置,如定時保存的時長、最近打開的文件數、當天任務字數;程序模式,如亮色模式、暗色模式、自定義模式;字體與字體大小等。
    3. 退出:退出前詢問是否保存。
  2. 文件菜單:
    1. 導入:為當前章節導入純文本格式。
    2. 導出:將當前章節、所選章節、全文導出為純文本格式。
    3. 分割:按章節將當前作品分割為多個作品。
    4. 合併:將iWriter多個作品合併為一個作品。
    5. 上線:設置上線,將選擇的章節上線到指定的站點。
    6. 頁面設置:設置頁面顯示的模式,單章節顯示跨章節顯示。
    7. 列印:按章節將作品列印出來。
  3. 編輯菜單:
    1. 撤消。
    2. 重做。
    3. 全選:選擇本章節所有內容。
    4. 選段:選擇本段內容。
    5. 選句:選當前句。
    6. 選上:選擇本章節滑鼠上所有內容。
    7. 選下:選擇本章節滑鼠下所有內容。
    8. 選句:選當前句。
    9. 刪除所選。
    10. 拼寫與語法。
  4. 格式化菜單:
    1. 字體加大。
    2. 字體減小。
  5. 視圖菜單:
    1. 放大:界面元素放大。
    2. 縮小:界面元素縮小。
    3. 格子線:編輯區顯示、隱藏方格子線。
    4. 行線:編輯區顯示、隱藏行線。
    5. 段落標號。各段前顯示段落標號。
    6. 全屏顯示。
  6. 窗口菜單:
    1. 顯示、隱藏最近打開小說欄
    2. 顯示、隱藏工具欄。
    3. 顯示、隱藏作業信息欄。
    4. 顯示、隱藏目錄欄。
    5. 顯示、隱藏角色欄。
    6. 顯示、隱藏備註欄。
    7. 顯示、隱藏符號欄。
    8. 顯示、隱藏搜索欄。
    9. 顯示、隱藏大綱欄。
    10. 顯示、隱藏字典欄。
  7. 幫助菜單
    1. 幫助。
    2. 註冊。

二、「iWriter」 文件格式設計:

文件格式一般分兩種:單文件與多文件格式,前都有PDF後者有EPUB。單文件格式,顧名思義是將所有的輸出數據保存在一個文件內;多文件格式,是將不同的輸出數據保存在不同的文件上,然後一起打包為一個文件。EPUB就是這麼乾的,大概地說是將整個靜態網站打包在一起。

由支持應用決定,iWriter需要保存的內容有:文件信息、目錄、角色、備註、符號、多個正文。

  • 單文件格式。將輸出的內容在一個文件內進行分區處理:大多都有文件頭,在前幾個位元組里表示,告訴解釋者這是什麼格式的文件;接下來可能是小區地址索引,告訴解釋者各小區的起止點,如:文件信息、字體信息、格式信息、壓縮加密信息、目錄或索引等;再接下來可能是各小區內容;最後是大區內容即主要內容,大區內容的分段起止由目錄或索引提供。下面以iWriter為例,作單文件格式設計,其中固定分段可以用起止符處理,所表述內容僅供參考,請留意。
  1. 前置信息:
    1. 0-7位元組,保存「iw」。文件頭:表明該文件是一個「iWriter」文件。是確認本文件的格式為iWriter所用,並可使用「iw」格式的約定繼續解釋。
    2. 8-24位元組,保存小區索引位置起止。
  2. 小區索引:
    1. 0-15,文件信息位置起止。
    2. 16-31,目錄位置起止。
    3. 32-47,角色位置起止。
    4. 48-63,備註位置起止。
    5. 64-79,符號位置起止。
    6. 80-95,大區位置起止。
    7. 128-143,確定索的壓縮方式。
    8. 144-159,確認正文的壓縮方式。
    9. 159-175,區域編碼方式。
    10. 175-303,加鹽的起止與提取方式,不想被第三方解釋。
    11. 再預留256節字。
    12. 空位元組。
  3. 文件信息:
    1. 0-7,保存「info」,確認文件信息起點正確。
    2. 8-255,文章標題。
    3. 其餘:作者,創建時間之類。
  4. 角色,以888分段保存角色信息:
    1. 0-7,保存「role」,確認角色起點正確。
    2. 8-127,角色名。
    3. 127-1015:角色說明。
  5. 符號,以888分段保存角色信息:
    1. 0-7,保存「symbol」,確認符號起點正確。
    2. 8-127,符號名。
    3. 127-1015:符號說明。
  6. 備註,以1024分段保存:
    1. 0-7,保存「note」,確認備註起點正確。
    2. 8-1031,備註內容。
  7. 目錄信息:
    1. 0-7,保存「catalog」,確認起點正確。
    2. 8-16,保存壓縮標誌,確認壓縮方法。
    3. 餘下解壓後以256分段。0-15,目錄對應正文的起止;16-23,索引號;其餘為目錄名。
  8. 正文信息:
    1. 0-1,保存索引號,確認起點正確。
    2. 後余解壓後得正文。
  • 多文件格式。將輸出按不同的數據分別保存在獨立的文件中,然後打包、加密、壓縮成一個文件,並以特寫後綴命名下面以iWriter為例作多文件格式設計,也是本案使用的格式,請看仔細了。另外需要說明的是,各數據使用創建時間的時間戳值為其的identifier,如:章節內容保存的文件名是「時間戳」+「.txt」。因為iWriter是個單機板,所以其identifier具有不重複性。
  1. 文件夾,以「iWriter」名。文件夾包含info.txt、catalog.txt、role.txt、symbol.txt、note.txt和各章節文件。前五者以保存JSON字元串,後者保存行文,注意txt後綴可省略。
  2. info.txt,作品信息。作品名、作者、創建時間、其它信息,JSON數據。

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. 序列,一. 序列。
刪除:支持顯示刪除文本,快捷方式:? 文本 ?。
臨時插入:支持顯示插入文本,快捷方式:^ 文本 ^。
**/

三、iWriter 開發說明。

在一個項目啟動後,我們不僅需要原型,需要對功能進行梳理,更需要對整個項目的開發作有步驟有節點的計劃與規劃。

記得很早之前,Facebook有一句口號是「Done is better than perfect」,我們當時的翻譯是:「輸出高於一切」。在程序開發中,由於感知問題,不同時期對事物的感覺不一樣,而這種感覺大多是現在的大如從前。不用說是產品經理,就是自己,寫的代碼時,寫著寫著,回頭一看,多是「今是昨非」感覺,於是念念的想去改。這樣的行為導致的結果是,計劃落空,甚至無法輸出。改變這一狀況的方法是:用最短的時間做出確定的輸出。 所以編程不僅是技術問題,還是一個管理的問題,那怕是只有你一個人在作業。即然是管理問題,我們需要從細處著手。

那該如何著手呢?即然標準是:用最短的時間做出確定的輸出。所以項目需要分階段,各個階段需要分節點,有計劃可檢測地輸出。對於程序開發來說,我們是這樣做的:首先,將程序功能按需求分階段, 如:基本的、適用的、優化的等,保證各階段的產品輸出。其次,在各個階段上,又要求按相關性分模塊實現功能。在按階段輸出的基礎上再按模塊逐一實現其功能,能保存在最短時間內輸出可量化、可檢測的結果。
  • 那我們將按階段、按模塊來計劃我們的iWriter項目的開發。從今天開始我們不僅是開發者,更是管理者。

階段。

前面我們窮舉了iWriter的功能,作為一個給用戶用來創作小說的程序,功能實在不多。這對於一個團隊來說,一個階段可以把它們全部搞定,但對於我們獨立開發者來說,還是分階段、按模塊有計旬的輸出比較好。所以我將iWriter開發分為兩個階段:可用階段、好用階段。我們將一些體驗性的,冗餘的功能放到第二階:

  1. 大綱。提供頭腦風暴的模式來設計作品的大綱,目錄設計有相同的功能。
  2. 標點符號格式文本。用 # 一級標題格式化一級標題,等等,工具欄工具有相似功能。
  3. 章節的連續載入。往上或下連續拖,本章節內容完成後,繼續下一章節或上一章節,單篇載入也夠用。
  4. 多語言。前期有英文也夠用。
  5. 設置。只有默認項不影響使用。
  6. 刪除線、臨時插入。可用可不用。
  7. 導入、導出文本。可用可不用。
  8. 上線。可用可不可

模塊。

模塊的劃分與功能的相關性有關,這樣每一個模塊完成後都可以進行測試。獨立模塊需要優先完成,有依賴的模塊在有條件後再開始。功能測試和單元測試對於個人開發者來說尤其重要,我們沒有時間、金錢、精力去做大量的成品測試,所以把關好每一個環節能為我們省不少事情。就這樣,我把iWriter 按相關性劃分了功能模塊:

  1. 文件:文件的新建、打開、保存、另存、最近打開、自動緩存、定時保存、導入、導出等與文件相關的操作。
  2. 布局:界面布局,區塊控制。
  3. 文本:文本基本編輯功能,格式化功能,標點符號的特定輸入支持格式化文本功能,作品與章節狀態,目錄導航,備註導航。
  4. 工具:字典、大綱、上線、角色導航、符號導航。

四、項目準備:

為了明天,為了功能模塊的輸出,今天我們要做好前期準備,我們又需要重建「iWriter」的macOS項目。嘿嘿,有點不好意思,但這是最後一次,這一次這個項目會陪我們到最後。

建好名為「iWriter」的macOS項目後,我們需要在Navigator Area中Project欄里iWriter群組下,再建六個群組,以便分類存放我們輸出的代碼。請留意,在舊版的Xcode里,這些新建的群組不會在文件夾里建立對應的目錄,而最新版本則可以了,很好,這個我喜歡。還有,目錄與文件的順序可以自己拖動排列:

  1. Views:自定義的組件。
  2. Models:數據相關的類。
  3. Business:業務處理類。
  4. Venders:第三方庫文件,如Sqlite, ZipArchive。
  5. Resources:圖片、圖標及其它資源。
  6. Other:沒法分類的,統統放到這裡。

如圖:

下一篇,文件模塊的實現。

讓我們在這裡,遇見明天的自己!姜友華


推薦閱讀:
相关文章