编程是一种“组合的艺术”

2023-11-01

 

编程是一种“组合的艺术”

 

——WPF实例分析

金旭亮

        

         有这么一句名言——政治是一种妥协的艺术。这一规律同样适用于软件技术。就我个人的观点,软件开发在一定意义上是一种“组合的艺术”,优秀的软件工程师类似于优秀的厨师,能将一些常见的原料变成一盘色香味俱全的美味佳肴。

         为何说编程是一种“组合的艺术”?且让我慢慢道来。

         众所周知,在软件开发过程中,每名软件工程师都要掌握大量的编程知识,比如如何访问数据库,如何控制线程的推进顺序等,掌握这些知识是顺利进行开发的必要条件。然而,仅有这些就够了吗?仅仅掌握了这些编程知识就足以开发出优秀的软件?

         在我看来,开发者还需要掌握“组合”的艺术,你必须知道在某个完成特定功能的程序中,你可以组合哪些基本的构造块,而这些基本的构造块又以何种方式优雅地组合在一起,构成一个有机的整体。

         基本的构造块不仅仅指可以直接拿来复用的软件组件(或者是SOA中的Service),还包括可以在不同项目间复用的典型代码(比如如何将一个double类型的数字保留两位小数的典型代码段)、技术解决方案(比如各种设计模式)或软件架构(比如成熟的多层分布式组件化系统框架、基于管道的系统架构)等等。

         我喜欢将软件开发中用到的构造块称为“七巧板”,而每一个成形的程序都是用这些七巧板拼出的图形。

 

 

1 七巧板

 

         如何开发出好的软件,不取决于你基于什么平台,使用什么技术,甚至也不完全取决于你的技术能力和对技术内幕的深刻把握,而取决于你是如何组合这些基本构造块的。

         在某项软件技术的学习过程中,你实际上完成的是“形成软件构造块”的任务,而在软件项目实际开发过程中,你实际上完成的是“使用现有软件构造块”拼“七巧板”的过程。

         这个有效并且成功地“拼图”的过程,就是我们软件工程理论中有关软件开发过程与方法部分的内容。

         明了这些思想,能指导我们更有效地学习软件技术。

         自学的过程,就是“形成软件构造块”的过程。

         开发的过程,就是“将软件构造块”组合为完成某一特定功能的程序的过程。

         作为一名教师,我很关注如何帮助学生更高效地学习软件技术,培养软件技能,就将这个思想进一步地推广与拓展了:

         软件技术教学的过程,就是将“软件构造块”组合为真实软件的过程展示给学生的过程,先让学生进行模仿,然后他就学会了创造

         重要的是学会方法,而非掌握知识。

         下面,我以WPF技术为例,展示一个教学实例。

         这是一个类似于Windows“资源管理器”的程序,完全采用WPF进行开发。

         先看一下最初的“原型”:

 

 

 

2 MyFileBrowser的最初版本

        

这是最终成品:

 

 

3 MyFileBrowser的最终版本

 

         可以看到,原始版本与最终版本实在是差异巨大,整个开发过程我设定了10个里程碑:

 

 

 

4 MyFileBrowser10个里程碑

 

         在整个开发过程中,每个里程碑都在前一个的基础上增加功能和更正发现的BUG

         整个项目用到了多项具体WPF编程技术(此即“软件构造块”),以下是最重要的几项:

         数据模板、资源、值转换器、数据触发器、平台调用、数据分组与排序、多线程。

         解剖这样一个程序的开发过程,就能基本掌握WPF开发中最重要最常用的技术,并对软件“拼图”的方法与过程有直观了解。通过模仿这种迭代的开发方式,学生就能逐步掌握有效的开发方法,掌握组合的艺术,培养出必要的开发技能,最终成长为一名优秀的软件工程师。

         只有在战争中才能学会战争,同样的,只有在实践中才能增长能力。

         动手“拼图”吧,期待着看到能让人眼睛一亮的优秀软件作品!

        

=====================

         载MyFileBrowser示例源码及相关文件

(注:上传了三次,第一次上传的压缩包不知什么原因损坏了,我就第二次上传。但第二次上传的文件久久不能在首页出现,也不知跑哪去了,更郁闷的是它现在不允许我重新上传了,一上传就说:此文件已上传过!晕,不让上传你得给出原有的链接啊!现在又看不到,又不让重新上传,也不允许 上传者删除自己上传的文件……

没办法,从压缩包中移除一个文件,然后改名,修改资源描述,第三次上传。

过两分钟刷新,第二次上传的文件链接出现了,但其字节数居然为0,点击下载,报告找不着文件!

还好第三次上传的可以正确下载和解压。

上传个小文件,折腾了我近1小时。CSDN的下载频道设计得太让人郁闷了!!!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程是一种“组合的艺术” 的相关文章

  • 树视图上下文菜单命令未触发

    我有一个绑定到某些属性类型的 Observable 集合的树视图 有一个 HierarchicalDataTemplate 在树视图中显示数据 现在我需要显示每个 HierarchicalDataTemplate 项目的特定上下文菜单 我使
  • WPF 中按钮的启用和禁用状态的不同图像

    我想根据按钮的状态更改下面代码中按钮的图像 即使用不同的图像来启用和禁用状态
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 我的 WPF 应用程序中的 SaveFileDialog 异常

    我的一位客户在保存文件时遇到 WPF 应用程序崩溃的情况 我的保存文件代码是 var saveFileDialog new SaveFileDialog InitialDirectory string Concat Environment
  • 基于另一个组合框的所选项目绑定组合框 - MVVM WPF

    我目前有一个组合框 其中填充了艺术家姓名 一旦选择了艺术家 我需要将其绑定到另一个组合框 在我看来 这些设置如下
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • WPF 中处理系统关闭

    如何在 WPF 中重写 WndProc 当我的窗口关闭时 我尝试检查我正在使用的文件是否被修改 如果是 我必须提示用户 你想保存更改吗 消息 然后关闭正在使用的文件和窗口 但是 当我的窗口仍然打开时 我无法处理用户重新启动 关闭 注销的情况
  • 关闭主窗口时 WPF 应用程序不会关闭

    我习惯了在 Visual Studio 中进行 WinForms 编程 但我想尝试一下 WPF 我向我的项目添加了另一个窗口 名为 Window01 主窗口称为MainWindow 之前public MainWindow 构造函数我声明Wi
  • 将 MahApps 图标与 ContextMenu 结合使用

    我正在使用 MahApps Metro UI 工具包编写 WPF 应用程序 http mahapps com guides quick start html http mahapps com guides quick start html
  • 如何使用 MVVM 打开和关闭新 Windows?

    对于 MVVM 和 WPF 什么是处理打开和关闭新窗口和对话框的好 直接方法 打开和关闭应该由 ViewModel 驱动 对吗 但 ViewModel 不应该知道视图 我通常为此使用接口 例如 如果我想在单独的窗口中编辑记录 我有一个接口
  • 如何将 WPF 窗口置于前面?

    我创建了一个单实例应用程序 并且希望在用户多次启动该应用程序时激活已打开的窗口 这工作正常 但我有一个问题 如果已经打开的窗口超出了另一个应用程序窗口 我必须将其放在前面 我尝试过 window Focus 和 window Show 但它
  • WPF ListBox - 如何从数据表中放入值?

    I have ListBox并希望将值放入此列表框中DataTable listBoxVisibleFields DataContext SelectedFields Where SelectedFields is a DataTable充
  • 在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?

    我想使用 xaml 中的 Visual Studio Designer 设计一个现代外观的 UI 它为我提供了一个很好的工具箱 我可以使用它通过拖放来直观地创建 UI 由于它几乎表现得像 HTML 我想知道它是否也有丰富的主题库 我找到了一
  • 当其他列子项折叠时调整 WPF 网格列的大小?

    我有两个控件Grid 并且需要制作一个来填充所有Grid另一个获得后的空间Collapseded 我不知道什么Container我可以使用吗 我试过了StackPanel and DockPanel我也是 但找不到好的解决方案 这是我的代码
  • 异步WCF调用来保存线程?

    In 另一个问题 https stackoverflow com q 19731600 279516 建议我发送异步网络请求 而不是在后台线程上发送同步请求 原因是为了不浪费一根线 我试图理解这是怎么回事 这是最初的做法 我可以理解这里怎么
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 如何从WPF中的数据网格中获取单元格的值? [复制]

    这个问题在这里已经有答案了 可能的重复 从 DataGrid 中选择 DataGridCell https stackoverflow com questions 9978119 select datagridcell from datag
  • 如何从作为 UWP 运行的 WPF 应用程序处理文件激活?

    我有一个WPF我想要处理文件激活的应用程序 我找到了通过向注册表添加特定值来解决问题的解决方案 问题是最终的应用程序应该是UWP应用程序 我正在使用桌面桥来执行此操作 如果应用程序运行为UWP 它无法到达注册表来设置这些特定值 有没有其他方
  • 在 WPF 中使用 Datagrid 进行多重选择

    我想知道如何使用 DataGridCheckBoxColumn 选择多行 这里我只能选择一行 但如何进行多项选择 我的 XAML 如下

随机推荐

  • Linux centos 卸载 ceph

    在CentOS上卸载Ceph的操作步骤 1 停止Ceph集群 首先 你需要停止Ceph集群中的所有服务 在每个节点上运行以下命令来停止所有服务 systemctl stop ceph target 2 卸载Ceph软件包 在每个节点上 使用
  • 在1-100中随机生成10个数字并进行排序

    1 生成10以内的数字 可以参考rand 10 2 生成1 10之间的数字 可以参考rand 10 1 3 特定的 要生成a b之间的数字 可以参考rand b a 1 a include
  • CSharp: QuestPDF create pdf file in donet core 6

  • UE4 分屏显示

    比较简单 直接附上蓝图 注意 启动模式选择独立游戏进程启动这样能够在两个屏幕上满屏显示 在UE4 版本上可以实现 不清楚在UE5上实现不了在两个屏幕上满屏显示 有疑惑或者想法这欢迎沟通交流 还要注意设置项目里面的屏幕设置 下面附上简单的分屏
  • js如何实现数组去重的常用方法

    聚沙成塔 每天进步一点点 专栏简介 使用 Set ES6 使用 filter 和 indexOf 使用 reduce 使用对象属性 使用 includes 方法 ES6 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上
  • 有人知道乐高机器人和乐高少儿编程区别吗

    乐高机器人和乐高少儿编程区别 现在很多的家长对于孩子的学习可以说是非常的用心 就拿现在很多的家长在给孩子选择少儿编程的学习课程的时候 可以说是非常的用心 就想要给孩子选择一个对于孩子有好处的课程 但是很多的家长对于乐高机器人和少儿编程的了解
  • 老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify

    老猿Python博文目录 一 引言 在 老猿学5G扫盲贴 中国移动的5G计费架构解读 介绍了5G融合计费的服务化接口包括 CHF提供给CTF使用的Nchf接口 OCF提供给CHF使用的Nchf 接口 这两个接口消息的内容都相同 只是服务端和
  • 安卓端自行实现工信部要求的隐私合规检测一(教你手写Xposed模块代码)

    前言 原文地址 安卓端自行实现工信部要求的隐私合规检测一 教你手写Xposed模块代码 转载者言 只是简单监控隐私权限可以使用Android 11的新特性AppOpsManager OnOpNotedCallback 参考下面文章 隐私合规
  • Maven中GeoTools的引入 - Maven 的 repository 与 mirror

    Maven中GeoTools的引入 Maven 的 repository 与 mirror 在Maven中引入GeoTools时找不到jar包 搜索了蛮久才明白是自己maven没有学明白 于是重学了一次maven 解决了这个问题 关键在于理
  • python-共现矩阵(共词矩阵)计算

    共现矩阵 共词矩阵 统计文本中两两词组之间共同出现的次数 以此来描述词组间的亲密度 code 我这里求的对角线元素为该字段在文本中出现的总次数 import pandas as pd def gx matrix vol li 整合一下 输入
  • knife4j介绍及使用

    Knife4jInsight是一款致力于基于OpenAPI2及OpenAPI3规范进行聚合的独立中间件 在Knife4j 4 0版本发布之际 作者也对该组件进行了了架构重新设计 代码重构 并也发布了该独立中间件的2 0版本 基于Spring
  • windows使用makefile的三种方法

    windows使用makefile的三种方法 想再在windows上尝试makefile的可以试一试 注意需要下载好mingw 配置好gcc路径 才能成功使用make 第1种方法只需要命令行 2 3种方法需要借助vscode实现 当用户编译
  • Rokoko for Maya

    Rokoko for Maya 动捕应用 一 什么是Rokoko 二 使用 Rokoko Stufio 暂时没打算记录如何操作 Maya插件 rokoko studio live 下载安装 如何使用 三 其他 一 什么是Rokoko Rok
  • Raspberry Pi 与Arduino SPI通信

    本教程介绍了使用SPI 串行外围设备接口总线 进行Raspberry Pi与Arduino通讯和控制的基本框架 SPI代表了一种非常完善的芯片间通信方法 该方法在两种设备的硬件中均实现 在这里 我们将详细探讨SPI 讨论硬件和软件注意事项
  • 波次

    播种式分拣是以汇总了多份订单的一个批次为单位进行分拣作业的 业内通常将这个作业的批次称为 波次 为了达到较高的工作效率 播种式分拣一般希望每个波次汇总较多的订单 但由于以下原因 每个波次汇总的订单绝不是越多越好 1完成订单的时间限制 通常情
  • JavaMail邮件发送不成功的那些坑人情况及分析说明

    前言 JavaMail的使用本身并不难 网上有不少案例 简单易懂 而且有详细的中文注解 但是由于JavaMail的机制设置不够完善 特别是异常出错时的参考信息太少 给初学者造成了不少麻烦 而我就是其中之一 在此 把我遇到过得那些坑总结出来
  • 图解人工智能知识架构(从知识角度告诉你人工智能到底学些啥)

    很多人都想学习人工智能 但是却不知道该学些啥 从宏观的视角搞清楚人工智能到底需要学习哪些领域的知识是至关重要的 这就好比要去逛一座大的商场 非常需要一份商场的楼层导览图 它能够告诉你各个楼层商户的分布 又好比去一个风景区游玩 非常需要一份景
  • VS2022安装easyx图形库教程

    下载easyx图形库 下载地址 EasyX Graphics Library for C 下载好后安装 点击安装 安装 前两项 easyx会自动识别VS版本 我们点击安装 安装好以后重启VS 测试一下 安装easyx推行库成功 问题 那么e
  • 5分钟带你快速了解微服务框架的前世今生

    目录 原始时代 青铜时代 黄金时代 铂金时代 钻石时代 星耀时代 王者时代 总结 原始时代 1969年11月 为了便于高校间共享资源 美国国防部高级研究计划管理局建立一个名为阿帕网络ARPAnet 起初只有四个节点 阿帕网起源 一年后阿帕网
  • 编程是一种“组合的艺术”

    编程是一种 组合的艺术 WPF实例分析 金旭亮 有这么一句名言 政治是一种妥协的艺术 这一规律同样适用于软件技术 就我个人的观点 软件开发在一定意义上是一种 组合的艺术 优秀的软件工程师类似于优秀的厨师 能将一些常见的原料变成一盘色香味俱全