界面层与逻辑层分离

界面层与业务逻辑层分离 看到这里的帖子http://topic.youkuaiyun.com/u/20080822/11/83fac755-6074-4994-bd7d-506541cd4e89.html,其中有个人的回答很受益 “ 谈一下我的观点: 首先,对你的问题,我觉得是两个问题搅在一起了,还是分开来讲比较好。 一个问题是软件分层和耦合的问题。 另一个问题是如何划分业务逻辑和界面的问题。 首先,软件 阅读详情
转自: http://bbs.youkuaiyun.com/topics/260019609

问题:

如何将 界面层 与 复杂的业务逻辑层 分离开来呢?或者是 分离开到一个什么样的程度算是不耦合?

 

某神回答:


谈一下我的观点:


首先,对你的问题,我觉得是两个问题搅在一起了,还是分开来讲比较好。

一个问题是软件分层和耦合的问题。

另一个问题是如何划分业务逻辑和界面的问题。

首先,软件设计为什么要分层,这是为了应对软件需求的变化来考虑的,软件需求总是在变的,但变化是有规律的,不易变化的需求叫稳定需求,而易变的需求叫不稳定的需求。
而软件设计分层就是为了在不同的层次上应对这些稳定性不同的需求,在上层设计中响应不稳定的需求,而在下层设计中实现稳定的需求,而在分层后的设计中使得上层依赖下层,而不允许下层依赖上层,则可以使得应对大部分需求变化时对系统的修改最少,这就是软件分层的原理和原则。

在一般的MIS系统中,通常数据库结构是最稳定的,轻易不会修改,扩充是有可能的(除非在设计数据库时对用户的业务分析有重大误解),所以通常数据层放在最下层;而业务逻辑也相对稳定但会有变化,所以放在中间层;而最易变的则是表现层,今天说字太小看不清,明天又说字太大看不全,这个说灰底色难看,那个说白底色晃眼。所以放在最上层。

关于耦合,这个词在结构化设计中用得很多,在面向对象中,通常讲依赖关系。上层对下层的依赖(或者说强耦合)是理所当然的。比如说,通常应用程序是上层,而操作系统是下层,你能说你编一个应用程序不对操作系统耦合吗?但下层对上层则绝对不能有依赖(或者说零耦合)。没听说过谁为了自己的应用程序能运行而要求微软修改操作系统的。

做到这样,你的系统就达到目的了,而完全没有必要为上层对下层的依赖(或者说强耦合)而耿耿于怀。
但下层对上层依赖则是一定要避免的,对这要极其重视。

当然你可能会觉得有时会无法避免,如MVC模式(在RUP中叫Entity-Control-Interface模式)中,实体变化后,不是要调用界面层来改变显示吗,这不就是下层依赖上层了吗?

是的,对于这样的逆向依赖,在你设计用例实现过程中没有必要考虑,在进行完初步的设计以后,再统一进行逆向依赖的反转。在面向对象设计中有几个反转这种依赖的手段,在下层定义事件(或消息)由上层来订阅是一种手段,在下层定义接口或抽象类,上层来实现该接口或继承这个抽象类也是一种手段。只要你做到不存在下层对上层的依赖,那么你的系统分层设计的目的就达到了。

关于如何划分业务逻辑和界面的问题。
我觉得这是一个对客户需求的理解和分解的问题,以及对应这些分解后的需求放在哪一层实现的问题,也就是业务逻辑层的职责和界面层的职责划分问题,业务逻辑层的职责应该严格限制在对业务原语的实现上,而界面层的职责则是控制数据的展现形式和将用户的操作翻译或映射到业务原语上。但客户提出的直接需求往往会将这两方面一并提出,并且其中的业务原语往往是隐含的和不明确的,则需要我们在理解用户需求的情况下去分解出哪些是业务原语,哪些是界面操作。

呵呵,太抽象了,举个例吧,简单点,我们常见的用户管理问题,客户说:用户密码都用“*”显示,用户改密码时,输入一遍老密码,输入两遍新密码,当老密码正确且两个新密码相同则修改成功。
显然在这个需求中,用*显示密码是界面层的职责,但业务原语是什么呢?是判断老密码正确且新密码相同吗?不对,业务原语只是用户可以改密码,于是业务逻辑层只要开放一个方法认证当前用户并更改密码就可以了,至于输入两遍并校对相同则是界面层的事。

总之对需求要分析,从中提取出真正的业务原语,当然有时这条界限是很模糊的,是否能正确的识别出业务原语,就看每个人的分析能力和经验了。 

C++与QML逻辑分离 C++与QML逻辑分离在现代软件开发中,越来越多的应用程序采用了Qt框架来构建图形界面。而Qt的QML作为一种XML-like的语言,已经成为构建Qt GUI的主要实现方式之一。与此同时,C++仍然是主导应用程序逻辑层的语言。在这样的背景下,如何将C++和QML有效地结合起来,成为了开发者必须要面对和解决的难题之一。相较于传统的开发方式,C++与QML逻辑分离可以将UI设计和逻辑开发分离,有效降低耦合度,提高代码可复用性、可维护性和可扩展性。 阅读详情

相关推荐

MFC串口接收数据并实时显示

能实现从串口收发数据,并实时显示波形,以及处理后的波形 能实现从串口收发数据,并实时显示波形,以及处理后的波形

设计模式(C++版)之(factory)工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 ************************************************ 工厂模式在《Java与模式》中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品; 2)工厂方法模式(Factory Method):又称为多形性工厂;

gaoxin12345679的专栏 912

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 324

用户界面与业务逻辑的分离

1、界面与逻辑 基本程序架构一般包含: -用户界面模块(UI) •接受用户输入及呈现数据 -业务逻辑模块(Business Logic) •根据用户需求处理数据 用户界面与业务逻辑如何交互? (架构原则?) 2、基本设计原则 功能模块之间需要进行解耦 ...

洋葱汪的博客 5874

关于LIO-SAM编译时出现错误 /usr/bin/ld: 找不到 -lBoost::timer

关于LIO-SAM编译时出现错误: 下载LIO-SAM代码 进入LIO-SAM文件夹,通过以下代码编译: mkdir build cd build cmake .. make 报错: /usr/bin/ld: 找不到 -lBoost::timer collect2: error: ld returned 1 exit status CMakeFiles/lio_sam_imuPreintegration.dir/build.make:759: recipe for target 'devel/lib/li

wwtx的博客 3648

(UE4 4.27) HISM性能优化:从空间剔除到合批渲染的实战解析

本文深入解析了UE4 4.27中HISM(UHierarchicalInstancedStaticMesh)组件的性能优化原理与实战技巧。核心在于利用其N叉树空间结构实现高效的CPU视锥剔除,并结合GPU实例化进行合批渲染。文章详细探讨了从控制叶子节点粒度、平衡剔除精度与渲染效率,到结合LOD系统等关键参数的调优方法,为开放世界或大场景的植被性能瓶颈提供了系统解决方案。

weixin_29015051的博客 327

MFC的 界面与逻辑分离(一)

刚开始MFC开发时,按照自己的逻辑些代码,于是很容易将界面 与逻辑混合一起,如此实现对于当时的开发确实很简单,不复杂,但到改bug时,你就会很苦恼,一大堆的代码不好处理,最好写代码之前就设计好,尽量将界面与逻辑实现分开,便于以后维护!例子待续.......

songsusu2011的专栏 2164

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

ui与逻辑分离的简单实现(登录界面)

ui与逻辑分离的简单实现(登录界面)

qq_56369428的博客 1059

【2026最新版】PCL点云处理算法汇总(C++长期更新版)

PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 63万+

12、有杆泵抽油系统:原理、性能与选择

本文全面介绍了有杆泵抽油系统的原理、性能分析和设备选择方法。有杆泵抽油系统广泛应用于石油开采领域,通过地面抽油装置与井下柱塞泵的配合,实现高效、稳定的原油提升。文章详细解析了系统的工作原理、组成结构、光杆运动特性、载荷计算、泵输送能力及功率需求,并提供了抽油装置的选择流程和实际案例分析。此外,还探讨了泵的容积效率影响因素、示功图的作用及系统优化运行的建议,为石油开采工程提供了理论支持和实践指导。

gan8painter的博客 433

逻辑层与界面层分离架构

文章目录逻辑层的JavaScript 逻辑层的JavaScript 小程序不是运行在浏览器中的,所以没有BOM和DOM对象 小程序的js有一些额外的成员 App方法:用于定义应用程序实例对象 Page方法:用于定义页面对象 getApp方法:用来获取全局应用程序对象 getCurrentPages方法:用来获取当前页面的调用栈(数组,最后一个就是当前页面) wx对象 用来提供核心API的 ...

qq_42216575的博客 1057

小龙虾 OpenClaw 权限全攻略:轻松激活 elevated (最新版 OpenClaw 自动化任务降智、无权限、无法执行sudo等系统命令、提升 elevated 权限的解决方案)

升级小龙虾 OpenClaw 后权限不足?elevated 报错?📛 本文教你如何正确配置 OpenClaw 权限💻,让自动化任务顺利执行 🚀

XiaoqiangClub的博客 733

微信小程序--逻辑层与界面层

一.逻辑层与界面层分离 小程序开发框架将我们需要完成的编码,划分成了两种类型的编码:逻辑编码(由JavaScript完成,业务数据供给界面事件处理),界面编码(页面结构WXML,页面样式WXSS,展示逻辑层的数据). 二.逻辑层的JavaScript 小程序开发中使用到的JavaScript同常规网页开发所使用的JavaScript有所差异,在小程序的开发之中,有很多的.js文件,...

AndroidAlvin的博客 917

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

微信小程序 — 逻辑层与界面层

小程序开发框架将我们需要完成的编码,划分成了两种类型的编码:逻辑编码(由JavaScript完成,业务数据供给界面事件处理),界面编码(页面结构WXML,页面样式WXSS,展示逻辑层的数据).

金戈鐡馬 975

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

利用反射将显示层分为界面层和界面逻辑层

本人刚投入工作,即接到项目经理分配的比较麻烦的任务,让我尝试为新版系统设计一个架构。暂且把整个系统分为三个层次,一、显示层(客户端);二、接口层(传输协议层);三、数据层(服务器端)[暂时忽略业务逻辑的东西]这篇文章首先分析一下我解决显示层时遇到的问题和采用的解决方法。先说一下旧版系统开发时存在的问题:1、代码量大,改版频繁;2、系统模块多、窗体控件多,更改一个控件工作量太大;3、为了提高竞争力,...

weixin_34242509的博客 217

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

微信小程序学习笔记(1) -- 基础知识入门

文章目录微信小程序一、简单了解1.常用api2.常用ui地址二、微信小程序应用配置根目录app.json界面外观pageswindowdebug:app.js:wxss页面结构page.json标签栏三、逻辑层与界面层分离架构逻辑层的JavaScript演示: getApp演示 getCurrentPages()演示符合commonjs规范演示 wx对象界面层(数据绑定)数据绑定--元素上绑定数据绑定--属性上绑定数据数据绑定--知识补充1.在{{}}中写字符串2.计算变量3.{{}} 可以解决 语法解析

baidu_21349635的专栏 926

视图引擎Smarty的简单使用

参考: http://www.jb51.net/article/5091.htm 参考:http://baike.baidu.com/link?url=FFySw2r-dsE-lTdQgGy2DpLhciXM-JqUagEIydE_aFY3rGMnlYrf4eOOWw-fK-MFNFMp8v7ddMOrmlnIHTlP4K 其中还包含来自对慕课网的学习。                什么

梦空间 1917

QT 界面与业务逻辑分离

Qt开发中界面与业务逻辑分离的核心理念与实践摘要:本文阐述了Qt开发中界面与逻辑分离的重要性及实现方法。通过信号槽机制、MVC模式、接口抽象等核心方法,实现UI与逻辑的解耦,提高代码复用性和维护性。文章介绍了三种开发模式(纯代码、QtDesigner、QML混合)及具体实践案例,强调"强内聚、弱耦合"的设计原则,避免循环依赖,建议通过定义接口契约实现模块间单向通信。这种分层架构设计能显著提升大型项目的开发效率和可维护性。

笔记 325

PyQt5逻辑分离

生成UI为:jiemian.py 逻辑层:luoji.py 入口层:rukou.py #jiemian.py from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): xxx def retranslateUi(self, MainWindow): x...

UncleShuShuShu的博客 308

真正的三层开发

微软的IDE奇妙之处就是在于其能够一直秉承“快速开发”的理念——对于一个初学者而言,通过简单的拖拉控件,以及各种对应的触发事件中写写画画就能开发出一个像模像样的程序来,实在是增强了他们的自信,和进一步研究、从事开发软件的兴趣。不过毕竟“金无赤足,人无完人”——微软这种快速开发理念会带来一个非常严重的问题——界面和代码逻辑上混合在一起,以至于修改界面要牵涉到代码的移动,真所谓“牵一发动全身”。虽

825

如何写结构优美的代码

结构优美的代码,是每个程序员的追求。可能这个没有严格的标准,但是有些原则会有助编写结构优美的代码。   1.对代码的逻辑层次要有感觉。 比如大体上,一个程序会分三个层次:界面层,逻辑层,数据层。简化后一般也有两个层次:界面和逻辑层。 逻辑层是去掉外表的,内在的,实质的东西。一般来说,就是表现为对数据的一组操作。 而界面层,是关注程序应该如何和用户沟通的。比如可视的视窗

滴水穿石 937

wpf page 界面渲染完成后执行自动操作_web前端项目-小程序界面与逻辑

主要内容数据绑定、渲染、界面层数据渲染和事件处理。第一节 数据绑定1.1 渲染层和逻辑层小程序宿主环境我们称微信客户端给小程序所提供的环境为宿主环境。小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能。小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View...

weixin_39640773的博客 761

Android中采用的MVC框架

本文转自:http://blog.youkuaiyun.com/randyjiawenjie/article/details/6649893     MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应用程序开发中都采用了MVC框架,例如:.NET,Java Spring,Java Struts,PHP 。那么MVC到底是什么,为什么被广泛使用?      简要说明下,什么是

ding_ding_123的博客 357

代码重构-MVC框架

1、什么是mvc框架 MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应用程序开发中都采用了MVC框架,例如:.NET,Java Spring,Java Struts,PHP 。那么MVC到底是什么,为什么被广泛使用? 简要说明下,什么是MVC。MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。一个逻辑模型可以对于

bluebell_55的专栏 1195
上一篇: ubuntu12.04设置wifi热点给Android设备
下一篇: 西游记中景点
SingingCoder
博客等级 码龄15年 9粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值