当前位置: 首页 > 编程日记 > 正文

[置顶] 面向业务开发应用

自从计算机出现后,快速便捷的从太平洋一样的文海中找到水滴大小的资料真正成为了可能,而能够帮助人们实现这一愿望的程序员就像中世纪的航海家一样用神秘的代码程序指引着计算机一步一步实现的需求。而他们所用的被称之为“程序”的序列组合,在一般人眼中,有如天书般难读难懂。

即使对于程序员来说,实现复杂的业务需求也不是一件容易的事情,这很大程度上归咎于现有的软件设计模式并不科学。在《探索流程的奥秘之三-如何树立业务流程》中,我们了解到用户关注的是结果(交付物)及结果的状态,而软件设计关注的是操作,而很不幸的是,程序员也是人,这种错位的思考模式很难让人轻易理解。

面向业务开发应用的方式修正了这种情况,它的主要出发点如下:

1. 所有的应用都是由若干业务流程组成

2. 人们在使用应用时,会对所操作的业务流程产生出业务数据来,如每次请假时会产生请假申请信息及执行信息。

3. 业务流程的产生业务数据是分步骤生成的,且根据步骤的执行情况会生成不同的数据,如请假申请只有批准后才会有执行信息。

4. 一个业务流程的业务数据会被另一个流程使用,是因为业务流程之间存在步骤流转,比如启动报销流程是因为有了出差业务,且出差业务中发生了消费。

5. 业务间的关联在数据关系上体现的是A业务记录中包含B业务记录中某项数据的集合,如出差活动的出差人集合。

6. 有时业务之间的关联是由我们并不注意的中间业务担当的。

下面我们以差旅应用为例,来看一看面向业务设计软件的过程:

图一 差旅应用业务流程关系图

人们在日常出差时,最直观的感受到出差、借款及报销这几项业务,各公司针对其均有相应的审批流程及办事流程,但这三个业务流程间的关系如何呢?从图一可以看出:

1.  这三项业务都与人员有关

2.  借款是直接挂在每个员工上的,但每次出差可能不止一个人出行,因此就需要增加"D02员工的出差活动"这个隐含意义的业务流程。

3.  每次借款和报销的发生实际上是通过发起的。

4.  很多公司在报销时往往要求填写报销明细,虽然每项报销明细并没有独立的审批过程,但其体现了集合关系,因此可以将报销明细看作特殊的没有审批步骤的业务流程。

确定了业务流程的关系后,我们就探究一下每项业务流程的特性。



图二出差业务简单流程图

图二是一个简单的出差业务管理流程图,与一般的框图不同,这张图反映了更多的我们传统软件开发模式下未考虑的细节:

1.  步骤的执行可以造成其他步骤跳转的失效,比如我们允许即使提交了申请,在未审批情况也可以修改申请时,修改申请的操作会造成原先提交申请跳转自动失效。

2. 步骤的操作人可能来自于业务流程自身,(我们称其为动态步骤操作人),比如取消出差活动的操作人为出差申请的申请人或审批人。

3.  任何步骤执行后都有可能产生多个跳转,也可能不产生任何跳转。

4.  如果跳转到交互步骤(需要操作人介入的步骤),则操作人有执行业务步骤的选择权,如果跳转定义了通知操作人,则被通知人的待处理队列中应该出现该步骤。

5. 如果跳转到自动执行步骤,计算机应该自动执行该步骤,并进行后续跳转,直到没有后续的自动执行步骤或遇到结束节点。

6. 业务记录的数据是在各个步骤中渐次获取的,可能多个步骤都对同一个数据操作,如创建申请、修改申请、调整出差活动都可修改出差期限。

7. 对于每个步骤的执行,除了传统的赋值计算操作,还会包括特定操作,比如通过审批处理时会针对出差人清单自动创建“出差人活动”业务记录,用于后续的借款、报销处理。

利用普知杰的协同应用系统平台,可以轻松的实现面向业务的应用构建,比如步骤跳转的操作如下:




图三: 流程设置时步骤跳转设置案例

对于使用者,只需要找到对应的业务记录后右键,即可进行相应的操作,如图,可以看到由于图三设置的目标跳转有4个交互步骤跳转,都设置了动态操作人为时间发起人,操作人发起的这条记录可以有4个操作,其在右键操作时可以选择四个步骤中的任一个进行操作:

图四: 业务记录的步骤操作举例

而换另一个操作人时,对于同样的记录,他是执行人,根据动态操作人的设置,他只能进行一个操作

特别要提及的是,经过此方式整理出来的业务记录数据,相互间是有关联关系的,如从员工可以查出其所有的出差、报销、借款记录来。这样就有利于我们快速的查询我们需要的任何信息。普知杰的协同应用系统通过自定义视图的设置,可以快速的实现这种需求。

面向业务开发应用还有很多有意思的特性,利用这些特性可以找到软件设计的通用规律,进而实现自动化的应用系统开发,让我们远离繁复的代码编程,我们后续会推出一个系列文章,欢迎大家指正。有兴趣的人也可以到普知杰网站下载评估版软件进行试用。这个地址可以下载到9个并发数不限期限的试用版系统和说明文档.

转载于:https://www.cnblogs.com/louisding/archive/2012/10/15/2763677.html

相关文章:

vector方法

借鉴网上资料&#xff0c;整理了vector使用的一些方法&#xff0c;记录下来&#xff0c;方便以后查阅 vector初始化 vector<int>a(10) //只定义长度 vector<int>a(10,1)//长度为10&#xff0c;初始值为1 vector<int>a(b); //用b向量来创建a向量&#xff0c;…

MyEclipse Enterprise Workbench 9.0 破解及注册机 注册码

MyEclipse 9.0的激活机制终于破解了&#xff0c;破解步骤比老版本要复杂一些&#xff0c;但是是绝对可以破解的&#xff0c;这个破解对主程序无任何修改&#xff0c;只替换公钥&#xff0c;如果有牛人会快速从公钥反推私钥&#xff0c;那就什么都不用改了&#xff0c;步骤如下&…

python字典一键多值_python字典中如何一键多值的写入?

python字典中如何一键多值的写入&#xff1f; python字典中一键多值写入的方法&#xff1a; 1、循环写入字典key、value、删除指定的键值对&#xff1a; 原文本‘jp_url.txt’每行元素以逗号分隔:host_key,product_id,product_name,cont_start,cont_end ah2.zhangyue.com,10000…

向实现细节低头

本来想搞明白所有的东西&#xff0c;然后自己集成&#xff0c;避免引入额外的组件&#xff0c;避免复杂的维护成本。 现在想想&#xff0c;相比于投入的巨大精力&#xff0c;其收益过小&#xff0c;还是要有所取舍。转载于:https://www.cnblogs.com/youge-OneSQL/p/9268924.htm…

Session丢值的问题

本来本地调试好好的,一上服务器session就非常容易丢失,表现在,用window.href跳转丢session,用httpmoulde丢session,在frame里面ifarme里面丢session,折磨了一天,才知道是因为应用程序池的原因,一个池里面放了太多网站,导致session丢失(系统还没有上线,光放那也不行), 还有应用程…

换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功

2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试&#xff0c;不通过再进行下面这步 https://getsupport.apple.com/?callerhome&PRKEYS 技术支持网址 然后就等电话吧&#xff0c;一般10秒钟就打过来了。 告诉原因&#xff0c;提供收费的订单号&a…

用eclipse阅读编辑android和kernel,uboot的源代码

from: http://hi.baidu.com/designhouse/blog/item/ff3f0df4a33571f37709d736.html 1. 用eclipse阅读编辑android源代码的配置方法有官方文档&#xff0c;非常详细&#xff0c;http://source.android.com/source/using-eclipse.html 阅读android代码用的是Eclipse IDE for Jav…

当一个序列满足对于任意的前 项和都满足不小于_时间序列分析第01讲--平稳序列(基本概念,线性平稳序列)...

第一章 平稳序列1.1平稳序列基本概念无论是从原序列中把趋势项去掉得到的随机波动项&#xff0c;还是用随机差分后得到残差序列&#xff0c;都会存在一种现象&#xff1a;随机项会沿着水平值波动&#xff0c;并且前后之间具有相关性&#xff0c;与独立序列不同。一、定义定义1.…

京医通如何删除临时卡,解绑

1、解绑的话&#xff0c;如果你是正式卡或者社保卡&#xff0c;可以在账户里面&#xff0c;点击卡进去详情页&#xff0c;里面会有一个解绑 2、重点就是临时卡了&#xff0c;挂号的时候很恶心。 目前唯一的解决办法就是&#xff0c;注销账户。 1&#xff09;、解绑所有正式卡 2…

T-SQL查询——详解公用表达式(CTE)

对于Select查询语句来说&#xff0c;通常情况下&#xff0c;为了是T-SQL代码更加简洁和刻度&#xff0c;在一个查询中应用另外的结果集都是通过视图而不是查询进行分解的&#xff0c;但是&#xff0c;视图作为系统对象存储在数据库中&#xff0c;那对于结果集仅仅需要在存储过程…

如何实现显示超过10个字符就显示省略号?

// 要展示的文本(nickName) this.nickName 风一样的女子凤一样的我&#xff0c;有想认识嘛~~ if (this.nickName.length > 10) {this.nickName this.nickName.substring(0, 10) "...";console.log(00, this.nickName)}备注&#xff1a;substring() 方法用于提取…

课程实验代码及动手动脑测试

枚举类型测试代码&#xff1a; public class EnumTest {public static void main(String[] args) {Size s Size.SMALL;Size t Size.LARGE;// s和t引用同一个对象&#xff1f;System.out.println(s t); //// 是原始数据类型吗&#xff1f;System.out.println(s.getClass().is…

python利用自动识别写模块_Python 利用pytesser模块识别图像文字

使用的是python的pytesser模块&#xff0c;原先想做的是图片中文识别&#xff0c;搞了一段时间了&#xff0c;在中文的识别上还是有很多问题&#xff0c;这里做记录分享。 可将图片中的文字转换成文本&#xff08;主要是英文&#xff09;。 1.pytesser安装 使用设备&#xff1a…

C02-程序设计基础提高班(C++)第9周上机任务-类和对象

第9周&#xff1a;阅读教材第8章&#xff08;p231-262&#xff09;&#xff0c;主要内容是类和对象&#xff0c;学会定义类和对象解决问题&#xff0c;完成第9周上机任务&#xff1b;(回到C02-程序设计基础提高班&#xff08;C&#xff09;学习安排)实践任务&#xff1a;【任务…

在不影响配置下,清除netscreen密码

在缺省情况下&#xff0c;设备恢复特征被启用。可通过输入 unset admin device-reset 命令禁用它。同样&#xff0c;如果NetScreen 设备处于 FIPS 模式&#xff0c;恢复特征被自动禁用。1. 在登录提示下&#xff0c;键入设备的序列号。2. 在密码提示下&#xff0c;再次键入序列…

如何删除一个CSDN上自己上传的资源

如何删除一个CSDN上自己上传的资源 第一步&#xff0c;找到你想删除的资源&#xff0c;其URL举例为&#xff1a;http://download.csdn.net/detail/ssergsw/9733040则删除的get请求为&#xff1a;http://download.csdn.net/index.php/user_console/del_my_source/9733040删除成功…

关于计算机中二进制原码,反码,补码的简要解释

原码&#xff0c;补码&#xff0c;反码的概念 正数原码&#xff1a;正数的原码为取绝对值的数转二进制&#xff0c;5的原码为 00000000 00000000 00000000 00000101 负数原码&#xff1a;负数的原码为取绝对值的数转二进制&#xff0c;然后符号位&#xff08;最高位&a…

python是一种面向对象的高级语言_爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?...

今天在知乎上看到一个关于【世纪佳缘找对象靠谱吗&#xff1f;】的讨论&#xff0c;其中关注的人有 1903&#xff0c;被浏览了 1940753 次&#xff0c;355 个回答中大多数都是不靠谱。用 Python 爬取世纪佳缘的数据是否能证明它的不靠谱&#xff1f;数据抓取 在 PC 端打开世纪佳…

使用邮件规则,将收到的邮件进行分类

随着工作的进行&#xff0c;我们经常会发现邮箱里一大堆各种各样的邮件&#xff0c;而要从中找到指定类型的邮件&#xff0c;只能每次都进行一次搜索。但是&#xff0c;经常这样搜索&#xff0c;先不说效率如何&#xff0c;它肯定会对我们的工作进行一些影响。 在这里&#xff…

多个CALayer的联动

在如何通过手势捕获CALayer基础上做了个示例&#xff0c;两个CALayer的联动&#xff0c;当拖动左侧的Layer的时候&#xff0c;右侧的Layer随动。因为右侧的动画没有关闭&#xff0c;有延迟&#xff0c;产生随动的效果。如果不想延迟&#xff0c;可参考拖动动画的问题及解决。 在…

在不允许新建对象的条件下,将list中指定条件的值去除

package com.liujianwang.learning;import java.util.LinkedList; import java.util.List;public class ListTest {public static void main(String[] args) {/** 在不允许新建对象的条件下&#xff0c;将list中指定条件的值去除。* 例如&#xff1a;移除list中值大于6的元素。…

openlayers map获取全部feature_tf2.0基础-tf.data与tf.feature_column

7.2.1 tf.data使用 tf.data API 可以轻松处理大量数据、不同的数据格式以及复杂的转换。tf.data API 在 TensorFlow 中引入了两个新的抽象类&#xff1a;tf.data.Dataset 表示一系列元素&#xff0c;其中每个元素包含一个或多个 Tensor 对象。&#xff1a;创建来源&#xff08;…

项目活动定义 概述

项目活动定义概述 项目活动定义是确认和描述项目的特定活动,它把项目的组成要素加以细分为可管理的更小部分&#xff0c;以便更好地管理和控制。 确定计划活动需要确定和记载计划完成的工作。活动定义过程识别处于工作分解结构&#xff08;WBS&#xff09;最下层&#xff0c;叫…

如何判断CPU、内存、磁盘的性能瓶颈?

1.如何判断CPU、内存、磁盘的瓶颈&#xff1f; CPU瓶颈 1) 查看CPU利用率。建议CPU指标如下 a) User Time&#xff1a;65%&#xff5e;70% b) System Time&#xff1a;30%&#xff5e;35% c) Idle&#xff1a;0%&#xff5e;5% 如果us,sy高于这个指标可以判断CPU有瓶颈 使用top…

一个苹果手机移动电源也能让他拽得跟二五八万似的

一个苹果手机移动电源也能让他拽得跟二五八万似的~~低调一定是美德&#xff0c;尤其是在见过各种JP人类之后&#xff0c;我真心在心里呐喊&#xff0c;你丫稍微低调一点会死啊&#xff01;&#xff01;&#xff01;是的&#xff0c;这个世界上不可能不存在拽得调子高的人&#…

Confluence 6 配置服务器基础地址

服务器基础地址&#xff08;Server Base URL&#xff09;是用户访问 Confluence 的 URL 地址。这个基础的 URL 地址必须与你在浏览器中访问 Confluence 中的地址。 Confluence 将会在安装的时候自动侦测基础的 URL&#xff0c;但是如果你的站点 URL 修改了&#xff0c;或者你的…

python gui编程框架添加工具栏_python gui编程,我是初学者。用tk,制作下拉菜单的command不分我想打开另一个界面。如和解决,求解!!...

展开全部 from tkinter import * def new_file(): print("Open new file") def open_file(): print("Open existing file") def stub_action(): print("Menu select") def makeCommandMenu(): CmdBtn Menubutton(mBar, textButton Commands, un…

这样在一个sql里完成更新和插入,只用一次数据库连接,效率提高了

代码如下&#xff0c;请给出具体修改代码 public void AddCategory(string nCategoryName, int nImgId, int nBelongToId, int nShopId, int nSortId) { int CategoryId 0; string cmdText "Select top 1 CategoryId from ProductCategory where Categ…

USACO Section 1.5 Checker Challenge

经典八皇后问题 只写的最基本的&#xff0c;对称剪枝&#xff0c;位运算都没有用&#xff0c;以后有时间再看 1 /* ID:linyvxi1 2 PROB:checker 3 LANG:C 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 int N; 9 int tota…