精华内容
下载资源
问答
  • VB程序架构模板

    热门讨论 2012-03-08 12:25:00
    VB程序架构模板
  • Symbian应用程序架构Symbian应用程序架构Symbian应用程序架构Symbian应用程序架构
  • 我使用Go和gRPC创建了一个微服务,并试图找出最佳的程序结构,它可以用作我未来程序的模板。 我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同。我写了一系列关于在项目工作中做出的设计...

    我使用Go和gRPC创建了一个微服务,并试图找出最佳的程序结构,它可以用作我未来程序的模板。 我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同。我写了一系列关于在项目工作中做出的设计决策和取舍的文章。 这是其中的第一篇, 是关于程序结构的。

    程序结构的资源

    Go的标准程序结构的最佳资源可能是Github上的标准Go程序结构¹,但它不适合我的项目。在阅读了Sylvain Wallez的文章²之后,我终于得到了一些关于其背后原因的信息。 Go起初是专为API和网络服务器而设计,Github上的大多数Go项目都是以库的形式编写的,因此“标准Go程序结构”可能非常适合。 商业微服务项目是一种完全不同的动物,需要不同的程序结构。但我还是采用了“标准Go程序结构”中适用的一些建议,这些建议约占30%。

    一般来说,创建应用程序结构有两种不同的方法:基于业务功能或基于技术结构。大家的共识³是基于业务功能的更好,对于单体项目(monolithic project)来说也确实如此。在微服务架构中,情况发生了变化,因为每个服务都有自己的源码库,这相当于已经把应用程序按业务功能查分成了一个个的微服务。因此,在每个微服务中,基于技术结构创建项目结构实际上是可行的。

    我还找到了Ben Johnson关于应用程序结构⁴和包结构⁵的一些好建议。但它没有为我的项目提供完整的解决方案,所以我决定创建自己的程序结构。程序结构取决于项目要求,以下是需求。

    项目需求:

    1.在数据持久层上支持不同的数据库(Sql和NoSql数据库)

    2.使用不同的协议(如gRPC或REST)支持来自其他微服务的数据

    3.松散耦合和高度内聚

    4.支持简单一致的日志记录,并能够更改它(例如,日志记录级别和日志记录库),而无需修改程序中的日志记录语句。

    5.支持业务级别的事物交易。

    程序结构也受到程序设计的影响。 我采用了 Bob Martin的清晰架构(Clean Architecture)⁶ 和 Go的 简洁⁷ 设计风格.

    在业务逻辑方面,有三层:“模型(model)”,即域模型; “数据服务(dataservice)”,它是数据持久性(数据库)层; “用例(usecase)”,这是业务逻辑层。

    顶层程序结构:

    file

    adapter: 这是应用程序和外部数据服务之间的接口,例如另一个gRPC服务。 所有数据转换都发生在这里,这样你的业务逻辑代码不需要了解外部服务的具体实现(无论是gRPC还是REST)。

    cmd: 命令。 所有不同类型的“main.go”都在这里,你可以有多个。 这是应用程序的起点。

    config: 设置程序和配置数据,包括配置文件。

    container: 应用程序依赖注入容器,负责创建具体类型并将它们注入每个函数。

    dataservice: 持久层,负责检索和修改域模型的数据。 它只依赖(depend)于模型(model)层。 数据服务可以通过RPC或RESTFul调用从数据库或其他微服务获取数据。

    model: 域模型层,具有域结构(model struct)。 所有其他层依赖于此层,而此层不依赖于任何其他层。

    script: 与设置应用程序相关的脚本,例如,数据库脚本。

    tool: 第三方工具。

    usecase : 这是一个重要的层并且是业务逻辑的切入点。 每个业务功能都由用例实现。 它是程序顶层,因此没有其他层依赖于它(“cmd”除外),但它依赖于其他层。

    用例和数据服务层功能全部由接口调用,因此可以轻松更改实现。

    顶级包下的子文件包:

    adapter:

    file

    当程序需要与微服务或其他外部服务进行交互时,你需要创建接口以减少依赖性。例如,本程序中的“缓存服务”是一个gRPC微服务。每个外部服务都有自己的子包和文件。例如,缓存服务具有“cacheclient”包和“cacheClient.go”文件,该文件定义了与外部“缓存”微服务交互的类型和方法。

    在我们的示例中,与其他数据服务不同,“cacheClient.go”文件没有定义缓存服务的接口。实际上它有一个,但是interface是在“dataservice”包中定义的,因为“缓存服务”也是一个数据服务。更明确的方法可能是在两个包中各自创建一个接口,这将保持包结构的统一。但是这两个接口将是相同且冗余的,所以我删除了适配器中的接口。

    由于我们还需要将应用程序本身发布为gRPC服务,因此需要在此处创建“userclient”子包。 “generatedclient”子包是为gRPC和Protobuf生成的代码。“userGrpc.go”用来处理域模型结构和gRPC结构之间的格式转换。

    cmd:

    file

    应用程序的命令,是整个程序的起点。 你可以将应用程序作为本地应用程序运行,也可以将其作为微服务应用程序运行,在这种情况下,你同时拥有客户端(grpcClientMain.go)和服务器端(grpcServerMain.go)主文件。 所有未来的主文件(main.go)也将在此处,例如,Web应用程序服务器主文件。

    config:

    file

    在此保存所有应用配置文件。 “appConfig.go”负责从配置文件中读取并数据将它们加载到应用程序配置结构中。 你可以为不同的环境提供不同的配置文件(YAML文件),例如“Dev”和“Prod”。

    container:

    file

    本程序中最复杂的包,它为每个接口创建具体结构并将它们注入其他层。此包中的子包结构类似于应用逻辑分层,它还具有“用例(usecase)”,“数据服务(dataservice)”和“数据存储(datastore)”层。

    在本包顶层,“container.go”定义容器接口,它的实现文件“serviceContainer.go”在“servicecontainer”子包中。它是此包的入口点,它将此包中的其他代码粘合在一起。 “usecasefactory”子包中的“registrationFactory.go”和其他工厂(factory)使用工厂方法模式(factory method pattern)创建具体结构(struct)。 日志⁸不属于任何应用层,因此我为它创建了一个单独的子包“loggerfactory”。它还有一个“logger”子包来定义日志记录接口。我在文章程序容器9中解释了这个包中的所有内容。

    dataservice:

    file

    域模型的持久层。 顶层只有一个文件 - “dataService.go”,它具有数据服务的所有接口,包括其他微服务提供的数据服务(例如gRPC)。 其他包只需要依赖于顶级数据服务接口,而不需要了解特定数据库的实现细节。

    对于域模型中的每种类型,都有相应的数据服务。 例如,对于模型“User”,有一个“userdata”子包,它包含用户持久性服务的所有实现,包括sqldb(MySql)和CouchDB。

    model:

    file

    该层不需要接口,模型都是具体结构。

    Script:

    file

    目前它只有MySql的数据库脚本。

    tool:

    file

    此程序包适用于第三方工具。 如果你不想直接依赖第三方库,或者需要增强这些第三方库,请在此处进行封装。 不要与“adapter”包混淆,后者也处理第三方库,但只适用于应用程序级数据服务。 “tool”包更适用于较低级别的库。

    useCase:

    file

    顶级包下只有一个文件“useCase.go”,它包含所有用例接口。 目前,有三个用例:“RegistrationUseCase”,“ListUserUseCase”和“ListCourse”。

    每个用例都有一个子包。 该子包中的文件定义了实现用例接口的具体结构。 所有其他包仅依赖于顶级的用例接口,不需要了解每个用例的实现细节。

    可能的问题:

    这个程序结构最终会产生很多小的子包,每个子包只有一个或几个文件。 这与Go习惯用法“考虑更少,更大的包¹⁰相矛盾. 以下才是习惯用法应创建的包:

    file

    如果你为其他人编写一个外部库,那么将代码放入一个大包中是一个很好的规则,因为人们不需要多个import语句来使用你的库。 但是在你自己的应用程序中,拥有小包是可以的,特别是当你只将接口暴露给其他层时。

    本程序为什要用小包呢? 首先“useCase.go”只定义接口,而其他包(容器除外)仅依赖于接口,因此“useCase.go”需要一个独立的包。 其次,用文件夹分隔每个用例使程序更清晰易读。

    结论:

    对于gRPC微服务项目,“标准Go程序结构”可能不太适合。 基于业务逻辑而不是技术结构创建应用程序结构对单体项目是一个很好的建议,不一定适合微服务项目。 本文使用一个真实的应用程序作为示例来展示什么是一个很好的微服务应用程序结构及其背后的原因。

    源程序:

    完整的源程序链接 github: https://github.com/jfeng45/servicetmpl

    索引:

    [1][golang-standards/project-layout]
    (https://github.com/golang-standards/project-layout)

    [2][Go: the Good, the Bad and the Ugly]
    (https://bluxte.net/musings/2018/04/10/go-good-bad-ugly/)

    [3][Package by feature, not layer]
    (http://www.javapractices.com/topic/TopicAction.do?Id=205)

    [4][Structuring Applications in Go]
    (https://medium.com/@benbjohnson/structuring-applications-in-go-3b04be4ff091)

    [5][Standard Package Layout]
    (https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1)

    [6][The Clean Code Blog]
    (https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)

    [7][Go at Google: Language Design in the Service of Software Engineering]
    (https://talks.golang.org/2012/splash.article)

    [8][Go Microservice with Clean Architecture: Application Logging]
    (https://jfeng45.github.io/posts/go_logging_and_error_handling/)

    [9][Go Microservice with Clean Architecture: Application Container]
    (https://jfeng45.github.io/posts/application_container/)

    [10][Practical Go: Real world advice for writing maintainable Go programs]
    (https://dave.cheney.net/practical-go/presentations/qcon-china.html)

    不堆砌术语,不罗列架构,不迷信权威,不盲从流行,坚持独立思考

    展开全文
  • 台达PLC程序架构V1.0.zip
  • 使用MVVM架构的示例应用程序结构。 该应用程序(目前)仅列出排名前10位的StackOverflow答题器以及有关当前用户配置文件的信息。 使用的库: -用于对SE Rest API的网络调用 用于依赖注入 用于将存储库(网络和...
  • VxBus驱动程序架构是VxWorks操作系统未来驱动程序发展的方向,也是设计VxWorks操作系统中设备驱动的必经之路。本文分析VxBus设备驱动架构的优点,VxBus组成结构以及基于VxBus架构的设备驱动开发流程。
  • 程序架构详解

    2018-11-30 11:03:35
    程序是一种不用下载就能使用的应用,也是一项门槛非常高的创新,经过将近两年的发展,已经构造了新的小程序开发环境和开发者生态。小程序也是这么多年来中国IT行业里一个真正能够影响到普通程序员...此文档为结构详解
  • 汇编语言程序结构

    千次阅读 2019-10-23 17:47:15
    程序的基本结构分为顺序、分支、循环、子程序 一、顺序结构 顺序结构程序是最简单的也是最基本的一种程序结构形式。这种结构程序程序的开头顺序的执行直到程序结束为止,执行过程中没有任何分支。 例:用查表...

    程序的基本结构分为顺序、分支、循环、子程序

    一、顺序结构

    顺序结构程序是最简单的也是最基本的一种程序结构形式。这种结构的程序有程序的开头顺序的执行直到程序结束为止,执行过程中没有任何分支。

    例:用查表的方法将一位十六进制数转换为与它相应的ASCII码

    DATA	SEGMENT
    		TABLE 	DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H	
    				DB 41H,42H,43H,44H,45H,46H					
    		NUMBER 	DB 8
    		ASCII 	DB ?				;数据定义
    DATA 	ENDS
    CODE 	SEGMENT
    		ASSUME CS:CODE, DS:DATA
    START: 	MOV AX, DATA
    		MOV DS, AX					;数据加载
    		MOV BX, OFFSET TABLE
    		MOV AL, NUMBER   
    		XLAT						;换码指令
    		MOV  ASCII, AL
    		MOV  AH, 4CH
    		INT  21H					;返回
    CODE 	ENDS
    		END START		 
    

    2、分支结构

    可以事先把各种可能出现的情况和处理的方法写在程序里,然后由计算机自动做出判断,并跳转或调用相应的程序处理。

    特点:其运行方向是向前的,再确定的条件下,只能执行多个分支中的一个分支。

    分支结构的分类
    在这里插入图片描述(1)双分支结构
    求a、b、c三个数中的最大值,并将其存入max单元。
    在这里插入图片描述

    Data 	segment
    		a dw 64
    		b dw 9
    		c dw 30
    		max dw ?
    Data 	ends
    Stack 	segment
    		db 100 dup(?)
    Stack 	ends
    Code 	segment
    		assume cs:code,ds:data,ss:stack
    start:	mov ax,data
    		mov ds,ax
    		mov ax,a
    		cmp ax,b
    		ja q1 
    		mov ax,b
    q1: 	cmp ax,c
    		jg q2
    		mov ax,c
    q2: 	mov max,ax
    		mov ah,4ch
    		int 21h
    code ends
    		end start
    

    (2)多分支结构
    是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。

    三、循环结构

    需要多次重复执行相同的或相似的功能

    1、循环程序结构
    (1)初始化部分:设置循环执行的初始化状态。
    (2)循环体部分:需要多次重复执行的部分。
    (3)循环控制部分:用于控制循环体的执行的次数。循环体每次执行后,应该修改循环条件,是循环能够在适当的时候终止执行。

    2、循环控制方法
    (1)计数控制法
    对于已知的循环程序次数,一般采取计数控制法来控制循环。CX 寄存器作为循环计数器。
    【例1】设有两个长度为8个字节的无符号数分别存放在以NUM1、NUM2为首地址的连续的内存单元中,将两个数相加,并将结果存入SUM内存单元中。
    【分析】8个字节可以当成4个字来运算,用循环带进位加4次即可。

    SHUJU 	SEGMENT
    		NUM1  DQ  1234506A812D778FH
    		NUM2  DQ  3E543289A566398CH
    		SUM   DQ  ?
    SHUJU	ENDS
    DAIMA	SEGMENT
    		ASSUME  CS:DAIMA,DS:SHUJU
    KAISHI:	MOV  AX,SHUJU
    		MOV  DS,AX   	
    		LEA  BX,NUM1   
    		LEA  SI,NUM2
    		LEA  DI,SUM   
    		MOV  CX,4
    		CLC
    JIXU:	MOV AX,WORD PTR [BX]
    		ADC AX,WORD PTR [SI]
    		MOV WORD PTR [DI],AX
    		ADD BX,2
    		ADD SI,2
    		ADD DI,2
    		LOOP JIXU
    		MOV AH,4CH
    		INT 21H
    DAIMA 	ENDS
    		END KAISHI
    

    (2)条件控制法
    循环次数未知,知道结束时的条件。
    【例2】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数送CN单元,累加和送SUM。
    【分析】用寄存器处理比较快速。因为结果要求送两种数,可分别用AX、BX操作。

    DATA 	SEGMENT
    		SUM  DW  ?
    		CN   DW  ?
    DATA	ENDS
    CODE	SEGMENT
    		ASSUME  CS:CODE,DS:DATA
    START:	MOV  AX,DATA
    		MOV  DS,AX   	;初始化
    		MOV  AX,0    	;0送AX
    		MOV  BX,0    	;0送BX
    LP: 	INC  BX      	;BX加1
    		ADD  AX,BX  	;求累加和
    		CMP  AX,1000	;条件控制
    		JBE  LP    		;≤1000转
    		MOV  SUM,AX
    		MOV  CN,BX  	;送结果
    		MOV  AH,4CH
    		INT  21H     	;返回DOS
    CODE    ENDS 
    		END  START
    

    (3)混合控制法
    嵌套多种控制循环。

    四、子程序

    主程序:往往要调用子程序或处理中断, 暂停主程序,执行子程序或中断服务程序。
    子程序:子程序又称为过程。在一个实际程序中,有些操作要执行多次,把要重复执行(subroutine)操作编为子程序。也常把一些常用的操作标准化、通用化成子程序。

    模块化程序设计方法按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把他们连接起来,形成一个大程序。
    子程序结构是模块化程序设计的基础

    调用子程序时需保留内容:

    ① 调用子程序:
    将CALL下条指令地址即IP值保留下来(8086中段寄存器CS和指令指针IP),才能保证子程序执行完后准确返回主程序继续执行。
    ② 执行子程序时:
    通常用到内部寄存器,执行结果会影响标志位,必须在调用子程序之前将现场保护起来。
    ③ 子程序嵌套或子程序递归(自调自):
    保留许多信息,而且保证正确返回(且后进先出)。后保留先取出原则(即LIFO-LAST In First out)。
    
    展开全文
  • 智能移动平台应用开发1 Android应用程序架构及其生命周期;Android应用程序架构;Android应用程序架构;Android应用程序架构;Android应用程序架构;Android应用程序架构;程序的生命周期(Life Cycle;程序的生命周期(Life ...
  • 本文包含一个109页的PPT讲述Android程序结构设计的理论和方法,附带一...一个Activity对应的,按照硬件划分模块的,内部结构和外部关系的架构模式; 用阅读信息量衡量程序结构的复杂度; 双向绑定的应用场景 数据流图;
  • Python程序结构

    千次阅读 2018-08-12 09:44:03
    程序结构: 1、程序由模块构成 2、模块包含语句 3、语句包含表达式 4、表达式建立并处理对象。 总的来说,Python的语法是由语句和表达式组成的。 语句: ...
  • Java Web程序结构

    千次阅读 2017-02-25 14:55:29
    简单的WEB程序结构 认识简单的WEB程序结构  认识了解Java web的基本程序结构是学习使用web的第一步,首先在下面通过一个对比看看简单的web程序结构 在myeclipse下我们新建一个普通的Java
  • 下位机程序架构总结

    千次阅读 2018-09-18 21:11:12
    项目经验:下位机程序架构总结 经过一段时间的项目经历,发现不同的项目之间在程序架构上面有着一些共同点,所以打算写来总结一下,方便以后对比补充和借鉴。 下位机往往都会和上位机通讯,所以我把软件架构总体...
  • 一、小程序架构 每个小程序的结构都是由两个主要部分构成:主体部分 + 各个页面。 类似于许多框架,主体部分主要用于核心的配置,各个页面主要用于不同业务场景。   1.1,主体部分主要由3个文件构成 1)app.js:小...
  • \应用程序架构指南Application Architecture Guide 2.0 \应用程序架构指南Application Architecture Guide 2.0 \应用程序架构指南Application Architecture Guide 2.0
  • 对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。前不就发帖与大家一起讨论了一下《谈谈怎样架构你的单片机程序》,发现真正使用...
  • .NET微服务-容器化应用程序架构指南。.net平台微服务现实解决方案
  • DSP程序结构(C6000系列)

    2012-04-26 13:59:34
    DSP程序结构的详细介绍,包括程序组成,编译过程,以及CMD文件
  • 程序开发
  • 一张图解释典型编译程序结构框图

    千次阅读 2017-10-04 11:10:14
    编译程序结构框图
  • 第三章 最简单的C程序设计–顺序程序结构的习题结构 经过前两章的练习现在可以由浅入深的学习C语言程序,总结了一些比较经典的题型,希望对学习C语言有些帮助 例1:将华氏温度转换为摄氏温度和绝对温度 ...
  • MCU应用程序架构整理(转)

    千次阅读 2018-10-29 13:50:25
    应用程序架构 简单的前后台顺序执行程序:多数人的使用方法,无需考虑程序的具体架构,直接通过顺序编写应用程序即可; 时间片轮询法: 介于顺序执行与操作系统之间的一种方法; 操作系统:应用程序编写的最优...
  • LabVIEW学习笔记(三)——程序结构

    万次阅读 多人点赞 2018-08-21 22:35:05
    LabVIEW 中的程序结构包括if-else循环,while循环结构,使能结构,公式节点和数学脚本节点等, 因此通过LabVIEW可以非常方便快速地实现任何复杂的程序结构。在LabVIEW 中,无论是循环结构、Case 结构还是条件式节点...
  • Java程序结构

    2015-12-22 21:46:17
    程序结果,帮助分享晨曦结果!
  • 单片机应用程序架构-时间片轮询法

    千次阅读 2019-06-21 15:29:55
    大致分为三类程序结构。 1. 简单的前后台顺序执行程序。 2. 时间片轮询法。 3. 操作系统。 简单的顺序执行的程序,写起来往往很混乱。越复杂的需求程序,完成需求的时间会更多,质量也并不好,bug也会越多,导致程序...
  •  每个任务是为了完成一个功能,如果这个功能的实现过程是一直占用进程处理资源的话,就称这个任务函数是占用式程序结构。 最常见的占用式程序结构就是延时函数了,比如我最常用的5ms延时函数 void delay5...
  • 淘宝程序架构实例

    2012-01-19 15:38:41
    本资源是淘宝的一个架构实例,通过它您可以在开发其他程序时借鉴其具体结构,也利于C#初学者更快的理解C#的用法和一些语法。
  • C语言_04 三种程序结构 顺序, 选择(分支), 循环结构

    万次阅读 多人点赞 2018-02-06 18:31:49
    在C语言程序中,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构; 顺序结构,从头到尾一句接着一句的执行下来,直到执行完最后一句; 选择结构,到某个节点后,会根据一次判断的结果来决定之后向哪...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,466,180
精华内容 1,386,472
关键字:

C程序架构