• 软件架构的数据流总结(一)



    1. Model-View-Controller(MVC框架)

    This architecture is used in simpleGUI applications,不管是MFC,还是Matlab,亦或是android,基本上关于界面的开发,都是基于这种软件框架。看来还有web应用程序亦是如此。事件驱动模型。

    MVC组件创建的步骤:1) 构建模型(model),然后通过引用包含到组件当中;2)创建view,传入模型的引用;3)作为change listener,view与model进行注册;4) view创建controller作为自己一个引用,并将引用传递至model。

    Mostoften you don't need to build such an architecture from scratch. Thearchitectures usually come with visual programming environments (like VisualC++, JBuilder, etc. etc.)

    2. Presentation-Abstraction-Control (PAC框架)


    几乎大部分现代的复合GUI设计都是基于此软件架构(loosely)。它是MVC组件框架的进一步发展,MVC只能限制在简单的GUI设计:一个或者多个views在一个相同的模型上。而PAC可以通过继承、hierarchical structure来实现复合的GUI设计。我想MFC的设计大致类似此架构。

    实际上,我们并不需要真的按照这种架构去从头开始设计,而是大部分的GUI设计都已经提供了这种框架,而理解这种框架对于GUI开发是有益处的。


    3. Pipe and Filter(管道过滤器)

    //实际上这个已经总结过了。

    在体系架构中,Pipe and Filter(管道过滤器架构),如下图所示,所有的Filter并行执行,Pump 或者Producer是data sources,可以是静态的文本文件,也可以是任何输入(比如键盘、网络数据等等); Sink 或者 Consumer是数据目标(data,target),可以是另一个文本文件,或者是数据库、计算机屏幕等。Pipe即是connector,在filter之间传递数据,应当具有data buffer(数据缓存)的作用,以匹配适应filter的处理速度;而Filter则是一个个处理单元,它接收来自pipe的数据,并进行处理(filter or transform),Filter可以有N多个input Pipes,也可以由N多个output Pipes。


    典型的应用案例:

    Unix编程:一个程序的输出linked to(connected)另一个程序的输入;

    DSP6678:一种数据流(data stream)的架构,每个core(内核)可以作为一个Filter,而共享内存等可以作为Pipes。这是DSP多核编程的一种常用架构。

    编译器:连贯的过滤器进行词汇分析、语法分析、语义分析和代码生成等。



    基于这样的架构(software architecture),所有的filter都可以在不同的线程(thread)、coroutines或者不同的机器上执行,可以是软件上或者是硬件上(FPGA)实现。

    缺点:

    1). 很明显,当Filter在等待它接收到所有的data并开始执行前,Pipe的有可能databuffer 溢出或者发生死锁。

    2).管道的数据类型可能会使得过滤器需要进行解析,这将slow down processing speed。如果构建了不同数据类型的管道,则该管道将不能链接到任何的过滤器上。

    4. layered system(分层系统)


    分层思想是操作系统软件一个非常重要的哲学思想。分层一般是人们解决复杂问题的一种手段。每一层都向上层提供透明的服务,所谓“透明”就是指屏蔽具体的细节,只需按照提供的接口规范进行操作就可以。“层”就是抽象出来的概念,比如操作系统就是通过抽象屏蔽硬件上的差异和繁杂,使得用户在上层使用计算机。


    另一个典型的应用就是OSI与TCP/IP分层结构。如下图。分层思想常用于operating systems 和 communication protocol上。


    当系统出现不同的功能级别时,底层的操作比较繁杂,因此你希望通过一次彻底的分层抽象一劳永逸地把层次建好,再次开发时仍然可以使用,因此只需从底层开发一次,把分层结构建好,就可以sort the rest out。其实我比较喜欢的就是关于驱动开发,其哲学思考就在此,一次开发完毕,就可以摆脱底层的开发,从而可以站在高层进行开发,一劳永逸。

    另外,分层思想的不断抽象让我联想到了神经网络(特别是deep learning),也是在不断地抽象,比如从底层的像素pixels,到edge抽象,再到object parts(combination of edges),再到高级的object models,不也是一层层的进行特征抽象转换吗?能够把握住哲学思想,总会有惊奇的发现。

    存在的问题也很明显,灵活性是不是受到影响?层与层之间的接口必须固定,这就造成了在灵活性上的一定限制。但是,好处还是远远大于坏处的。我就非常赞赏这个分层思想。有时候固定可能比灵活性更好。

    5. Microkernel(微内核架构)


    是操作系统的一个基,来适应操作系统的剧烈变化。这种架构实际上是分层系统的一个特例。包含两个adapters,较低的层Microkernel用来屏蔽硬件特别的模块,较高的层叫做适配器(Adapter)用来屏蔽系统特别的模块。Microkernel包含操作系统所需的绝对最小功能,它是平台依赖的,基于Internal Server来实现。而Adapter则用来实现可移植,当改变External Server时,都不用改变之上的应用程序。

    6. Client-Server / N-Tier Systems


    N-Tier 体系架构实际上是C/S +分层体系的联合。C/S架构包括2-Tiers,客户端发起通讯,服务器提供服务。以三层的架构为例,first tier,即presentation tier,the client或者front-end(web前端),负责处理与用户的交互。通常的client由一些动态的HTML pages构成,用户可以通过webbrowser进行访问。Second or application tier,即server或者back-end,或middleware(中间件),处理client传来的用户请求,它虽然可以处理所有功能,但并不存储persistent data(长存数据),一般需要连接database服务器。也就是third tier,database tier,包含了数据库管理系统来管理长存数据。在第二层或第三层,由于scalability(可伸缩性),load-balancing和redundancy(冗余性)等原因,可能有多个应用实例(instances),就是说,增加了额外的设备来做同样的事情。虽然使得服务器更加强大,但有可能引入同步问题。

    典型应用:web-applications。一般开发都是基于现有模型,要么开发前端应用,要么开发后端代码,嵌入到框架下就可以了。Client与client之间不是直接交互,而是通过中间人或者server转发等,通讯一般是via a network。

    7. Repository(典型的database存储架构)

    Compiler Use a repository.

    Databased are repositories. 尽管数据库的所有客户端都在同时请求,database需要实现锁机制来保证repository的完整性。会有同步问题,当一些Knowledge Sources并行访问时需要特别的小心。

    下续

  • 相关阅读:
    [转]C++ Operator Overloading Guidelines
    SICP学习笔记(2.2.1)
    .net中模拟键盘和鼠标操作
    javaScript系列 [17]运算符
    javaScript系列 [24]Math
    javaScript系列 [19]string
    javaScript系列 [22]引用类型
    javaScript系列 [12]Canvas绘图(曲线)
    javaScript系列 [15]Canvas绘图(压缩)
    javaScript系列 [21]Array
  • 原文地址:https://www.cnblogs.com/huty/p/8519350.html
Copyright © 2020-2023  润新知