Winform開發中的困境及解決方案

来源:https://www.cnblogs.com/wuhuacong/archive/2020/07/24/13370453.html
-Advertisement-
Play Games

在我們開發各種應用的時候,都會碰到很多不同的問題,這些問題涉及架構、模塊組合、界面處理、共同部分抽象等方面,我們這裡以Winform開發為例,從系統模塊化、界面組件選擇、業務模塊場景劃分、界面基類和輔助類處理、代碼生成工具輔助開發等方面介紹在實際項目開發過程中碰到的困境和相關的解決方案,以便分析其中... ...


在我們開發各種應用的時候,都會碰到很多不同的問題,這些問題涉及架構、模塊組合、界面處理、共同部分抽象等方面,我們這裡以Winform開發為例,從系統模塊化、界面組件選擇、業務模塊場景劃分、界面基類和輔助類處理、代碼生成工具輔助開發等方面介紹在實際項目開發過程中碰到的困境和相關的解決方案,以便分析其中是如何逐步提高效率和整體用戶體驗的。

1、系統模塊化

軟體和建築工程很類似,都是需要構建一個龐大而功能完整的一個系統,而工程化也意味著需要多人協作,那麼就需要把一個龐大的系統橫向或者縱向劃分為各個可以獨立施工完成的模塊,雖然各個模塊之間有所銜接或者交互,但是基本上可以以模塊化的方式來構建,這個也是工程化開發的精髓所在。

以一個軟體管理系統為例,我們儘可能把精力焦點放在客戶的業務需求上,而對於常規的如許可權控制、字典管理等一些常用的內容,由於它們的處理邏輯在特定領域上基本上比較固定一些,可以儘可能獨立並重覆使用,

而有時候,以某個特定的業務來說,同時很多處理規則也是不變的,因此也可以以業務模塊的方式來劃分,從而類似通用模塊的方式重覆使用。

模塊化類似小孩子搭積木的方式構建一個所要的形狀,雖然軟體和建築在這方面肯定更加複雜化,但是模塊化系統是大勢所趨,也是簡化開發、易於維護、提高系統健壯性的重要舉措。

 

2、界面組件選擇

在Winform內置的傳統樣式裡面,雖然提供了很多很好的界面組件,不過整體效果還是比較古板。為了增強界面的處理效果,我們一般使用一些第三方的界面套件作為Winform開發的基礎,這個除了可以提高整體界面的效果外,還在很多控制項層面提供豐富的處理和響應。

以前嘗試過各種類型的界面套件,最終還是對DevExpress情有獨鍾,不僅僅是因為它是大軟體公司開發的界面套件,也是因為它在界面層次提供了很多豐富的界面組件和強大的屬性設置,能夠極大滿足各種界面複雜的要求。

使用DevExpress界面套件,可以使得我們開發的界面更加漂亮,用戶體驗也更好。

 

或者類似效果

 

3、業務模塊的場景劃分

前面說過,一個系統為了簡化開發、易於維護、提高系統健壯性的可以把它按功能方式劃分為各個獨立模塊進行開發或者重用,而對於業務模塊來說,我們也還可以進一步細分。

一般系統界面中,大多數標準方式是展示業務數據的查詢列表,然後在根據需要對特定記錄進行編輯、查看、刪除等操作。

我們把常規的列表界面,新增、編輯、查看、導入等界面放在一起,除了列表頁面,其他內容以彈出層對話框的方式進行處理,如下界面示意所示。

如對於列表內容的展示,一般展示效果如下所示,主要展示資料庫裡面的二維表信息。

除了列表界面,另外一個就是對數據的明細展示界面了,這個界面內容可以更加多元化,如在裡面承載各種控制項,如文本、日期、圖片、下拉列表、樹形列表,以及我們自定義的一些控制項,如對於附件的通過管理展示控制項。

 

 有了這些標準的展示效果,我們就可以參照這些,使用代碼生成工具輔助頁面內容的生成的了,生成規則以資料庫元數據為參考即可。

 

4、界面基類和輔助類的處理

我們以常規業務模塊界面來分析,主要有明細查看或編輯界面、列表界面,那麼這些界面為了方便使用,我們可以抽象一部分界面處理邏輯或者共有部分內容,放在界面基類BaseEdit或者BaseDock等基類裡面,如下界面所示。

儘可能把一些涉及到業務數據的處理通用規則放到基類,而變化部分則在子類進行處理即可。這樣可以簡化生成界面的代碼,以及提高可重用率,減少維護的難度和代碼臃腫。 

對於一般的業務系統,可能都會涉及到不同資料庫的使用,如SQLServer、Oracle、Mysql、PostgreSQL等資料庫,那麼這部分,可以通過使用微軟企業庫或者其他ORM方式進行處理,以實現系統對多種資料庫的良好支持。

 

5、代碼生成工具輔助開發

通過上面的介紹,通用部分作為模塊獨立使用,業務模塊的界面主要劃分列表和編輯查看界面兩部分,而各自又進行了一定的基類抽象處理,那麼相對來說已經簡化很多了,不過對於業務數據來說,我們還是需要做很多重覆性的工作,如界面顯示、界面賦值及調用介面處理等操作,這些對業務對象固定的話,其實也是規則類似的,那麼這部分我們結合代碼生成工具進行批量生成即可,生成後進行一定的微調,可以極大降低出錯的幾率,減少代碼的編寫量。

 在我們開發軟體的時候,解決方案項目基於一定的分層組織,每個項目分層中,各個類的關係也是確定的,藉助輔助工具(結合模板引擎)可以快速生成我們所需要的代碼,並極大提高我們軟體的開發效率,Database2Sharp代碼生成工具就是一款專門針對我們自己框架結構配套的開發工具。

Database2Sharp代碼生成工具,主要是基於資料庫提取的元數據信息,根據表的信息和關係,欄位信息等內容,生成我們框架所需要分層的類代碼。

對於Winform開發,可以根據Winform框架或者混合框架的窗體界面類,生成標準的界面代碼,列表界面預設具有分頁查詢、導入導出、高級查詢、編輯、刪除事件綁定,編輯界面則具有獲取數據並顯示在控制項,保存後執行更新或者寫入的操作。

 

 

 

7、其他

除了前面介紹的部分外,一般大的方面,我們還可以以業務方式做一些獨立的組件模塊,以方便重覆使用,這個是大的方面。

模塊化,一般需要構建好對應的框架架構,每個獨立的模塊,都是遵循統一的框架架構方式處理,可以極大提高代碼的開發效率和降低維護的難度。

Winform開發架構如下所示。

 而對於混合方式的Winform開發,那麼還設計Web API模塊的部署,以及客戶端對Web API調用的封裝,如下所示。

 小的方面,還可以進一步劃分一些常用的界面處理元素,如自定義控制項的方式進行特殊組件的開發工作。如隨筆《在Winform界面使用自定義用戶控制項及TabelPanel和StackPanel佈局控制項》、《在Winform系統界面中對進展階段的動態展示和處理》。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇要學習的內容和知識結構概覽 函數的參數及其傳遞方式 1. 函數參數傳遞方式 傳值: 傳變數值: 將實參記憶體中的內容拷貝一份給形參, 兩者是不同的兩塊記憶體 傳地址值: 將實參所對應的記憶體空間的地址值給形參, 形參是一個指針, 指向實參所對應的記憶體空間 傳引用: 形參是對實參的引用, 形參和實參是同 ...
  • K近鄰演算法(KNN,K-NearestNeighbor)是機器學習或數據分析中最基礎、也是最簡單的演算法之一,這個演算法的思路就如同它字面上的意思“K個最近的鄰居”,想要得到某個樣本的某個特征的值(一個樣本通常有多個特征),就需要找到距離它最近的K個樣本,然後根據這些樣本的該特征的近似值作為它的特征值。 ...
  • 百度雲盤:Python入門經典以解決計算問題為導向的Python編程實踐PDF高清完整版免費下載 提取碼:6e8d 內容簡介 《Python入門經典:以解決計算問題為導向的Python編程實踐》是一本系統而科學的Python入門教程,美國密歇根州立大學等多所美國知名高校採用其作為編程語言的入門教材, ...
  • 大量使用的對象,重覆的創建和銷毀,很耗費性能,這個時候就要使用對象池技術。 ...
  • 一、函數嵌套 1.函數的嵌套調用 在調用一個函數的過程中又調用其他函數 將一個大工能拆解成很多小功能 每個函數名都是全局變數,可以在全局有效 2.函數的嵌套定義 在函數內定義其他函數 子函數只能能在函數中被使用,子函數名只在局部有效 最外層函數相當於一個容器,裝了很多子函數 3.函數的嵌套調用和嵌套 ...
  • 百度網盤:Python項目開發實戰(第2版)PDF高清完整版免費下載 提取碼:exep 內容簡介 本書來自真正的開發現場,是BePROUD公司眾多極客在真實項目中的經驗總結和智慧結晶。作者從Python的環境搭建開始講起,介紹了Web應用的開發方法、項目管理及審查、測試與高效部署、伺服器調試等內容, ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:彥頁走刀口 今天我們來看看用ghpython怎麼實現koch曲線的分形效果,前兩天分享的雪花分形是利用grasshopper的迴圈插件anemone實現的,然後有個小伙 ...
  • 前言 在朋友的項目有個自定義配置文件user.yml,其內容如下 user: userId: 1 name: 張三 email: [email protected] 其映射實體內容為如下 @Data @AllArgsConstructor @NoArgsConstructor @Builder @Pro ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...