精华内容
下载资源
问答
  • 下面属于系统基本功能模块
    千次阅读
    2021-07-15 01:07:59

    操作系统可以分为五大管理2113功能部分:1)设备管理5261:主要是负责内核与4102外围设备的数据交互,实质是对硬1653件设备的管理,包括对输入输出设备的分配,初始化,维护与回收等。例如管理音频输入输出。2)作业管理:这部分功能主要是负责人机交互,图形界面或者系统任务的管理。3)文件管理:这部分功能涉及文件的逻辑组织和物理组织,目录结构和管理等。从操作系统的角度来看,文件系统是系统对文件存储器的存储空间进行分配,维护和回收,同时负责文件的索引,共享和权限保护。而从用户的角度来说,文件系统是按照文件目录和文件名来进行存取的。4)进程管理:说明一个进程存在的唯一标志是pcb(进程控制块),负

    计算机操作系统是用户与计算机的接口,在计算机中,操作系统是其最基本也是最重要的基础性系统软件;

    操作系统通常应包括下列五大功能模块: (1)处理器管理。当多个程序同时运行时,解决处理器(CPU)时间的分配问题。 (2)作业管理。完成某个独立任务的程序

    可以使计算机系统能协调、高效和可靠地进行工作,处理器管理、存储器管理、设备管理,文件管理、作业管理等功能模块,处理器管理最基本的功能是处理中断事件,也叫进程管理,存储器管理的主要任务是分配内存空间,保证各作业占用的存储空间不发生矛盾;

    操作系统(Operating System,简称OS)是一管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。操作系统是一个庞大的管理控制程序,大致包括5个方面

    210c0407cfb1c885d0494f1a7f021aa5.png

    设备管理是负责管理各类外围设备,包括分配、启动和故障处理等,文件管理是指操作系统对信息资源的管理,作业管理包括作业的输入和输出,还有作业的调度与控制;

    操作系统的主要功能是资源管理,程序控制和人机交互等。计算机系统的资源可分为设备资源和信息资源两大类。 操作系统位于底层硬件与用户之间,是两者沟通的

    0a36a9577f4ee51099e1b129441622b6.png

    今天的视频就到这里,希望能够帮到大家。

    操作系统是系统软件,就是一个平台,各种应用软件要安装在这个平台上才能使用 没有操作系统,什么应用软件也没用 常用的操作系统: 1、DOS 2、UNIX 3、LINUX 4、

    操作系统是管理计算机硬2113件与软件资源的计5261算机程序,4102同时也是计算机系统的内核1653与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务,提供一个让用户与系统交互的操作界面。操作系统的功能有:1、进程管理:中央处理器,在宏内核的情况下多进程只是简单迅速地切换各进程,让每个进程都能够运行,在多内核或多处理器的情况下,所有进程透过许多协同技术在各处理器或内核上转换。2、内存管理:有许多进程存储于记忆设备上,操作系统必须防止它们互相干扰对方的存储器内容,除非透过某些协议在可控制的范围下操作,并限制可访问的存储器

    更多相关内容
  • 应用软件开发,就是对数据库进行增删改查操作?软件架构选型,就是选择几款流行的中间件?软件架构设计,就是把几个中间件串在一起?...本篇文章从应用软件的模块设计层面讲述软件设计的真正要求。

    应用软件开发,就是对数据库进行增删改查操作?软件架构选型,就是选择几款流行的中间件?软件架构设计,就是把几个中间件串在一起?如果真的这么认为,那么对应用系统设计可能还存在理解深度。本篇文章从应用软件的模块设计层面讲述软件设计的真正要求。

    功能模块拆分是在全面了解业务需求后,以寻找大量内聚性调用确定模块边界为目的,以寻求应用软件中易变变性和不易不变性的边界为目的应用系统设计过程。但是讨论功能模块拆分的前提是弄清楚什么是功能模块,然后才能讨论功能模块的拆分原则和设计方案

    1、功能模块的概念

    功能模块从业务层面的理解很简单,就是一个名词:如用户模块、订单模块、支付模块、合同模块;但隐含在这个名词下“功能模块”的技术意义,就至少需要具备以下特点:

    • 单一业务性:功能模块一定只处理单一业务,功能模块本身可能不能完成业务闭环,但业务闭环中关于某个业务点的处理,都应该由一个模块完成。

    • 闭合性和开放性:闭合性是指功能模块内部实现细节应该对外关闭,任何调用者不能进行修改。外部调用者要么使用要么不使用、要么直接使用要么整体替换;开放性是指业务模块本身的扩展是开放的,开发人员在不改变模块现有功能的情况下,可以对模块功能进行新增。

    • 抽象性:实际上该特点与上一个特点是紧密联系的,抽象性来源对业务需求的提取,通俗的来讲就是确定的业务边界有利于功能模块自身的扩展;例如车销订单和电商订单,虽然两种订单用于不同的业务闭环,但其业务的关键信息和对后续业务的驱动作用是一致的,所以两种类型的订单都应该归纳为一个订单模块。抽象性保证了功能模块的闭合性。

    • 接口规范性:接口规范性是指功能模块提供给外部调用者的接口调用方式、事件订阅方式是有边界的、稳定的。模块的接口可以进行规范且边界可控的原因,主要有赖于功能模块的单一业务性。如果开发人员发现功能模块提供给外部调用者的接口随时都在变化,那么说明模块的拆分存在问题。规范性同时保证了功能模块的开放性和闭合性。

    • 单向依赖的定位性:模块和外部模块的依赖一定是单向的,也就是说A模块如果直接或者间接依赖于B模块,那么B模块就一定不会“察觉”A模块的存在。由于依赖的单向性,所以模块在整个系统/子系统中一定可以找到清晰的层次定位。如果开发者发现模块无法在系统/子系统明确定位,那么说明模块的拆分存在问题。

    除了功能模块自身需具备的特点外,循环依赖问题也和功能模块的划分存在联系。那么什么叫循环依赖呢?循环依赖就是:两个或多个功能模块在接口层面出现相互依赖(包括直接和间接)的情况,例如岗位功能直接调用了用户功能的接口,用户功能在实现过程中又同时调用了岗位功能的接口(实际工作中,那些间接产生的循环调用,也会形成循环依赖),示例代码如下:

    // 岗位模块逻辑实现中依赖了用户模块的接口
    // ……
    public class PositionServiceImpl implements PositionService {
      @Autowired
      private UserService userService;
      public void doSomething() { }
    }
    // ============
    // 用户模块的逻辑实现中依赖了岗位模块的接口
    // ……
    public class UserServiceImpl implements UserService {
      @Autowired
      private PositionService positionService;
      public void doOtherthing() { }
    }
    

    循环依赖本身不是绝症,在编程技巧上来说循环依赖还可以减小功能逻辑的实现难度,提高单位时间内代码的编写效率(不需要关注设计模式的应用,只需要按照业务流程撸出代码)。但是如果将循环依赖状态和模块设计联系在一起,那么循环依赖将会对功能模块设计产生较大负面影响。

    简单来说,如果功能模块间出现循环依赖,那么功能模块就无法形成单向依赖,无法稳定在系统/子系统上的某个固定层级;另外,如果功能模块内部出现循环依赖,就代表这个功能模块无法继续向下进行更细粒度的拆分。
    在这里插入图片描述
    为什么模块间存在循环依赖就表明模块拆分失败呢?这是因为一旦存在循环依赖,将直接导致功能模块不满足单向依赖的特点要求,也就无法稳定存在于系统/子系统上的某个层级。也就是说,功能模块内部是否存在循环依赖是进行模块边界辨识的重要依据。边界以外的功能和本模块只存在标准的接口调用和事件订阅;边界以内的功能由于存在循环依赖,所以不能再继续向下进行更细粒度的拆分。如果边界以内的功能不存在循环依赖,那么说明模块还可以继续向下进行更细粒度的拆分(虽然不一定要这样做)。

    2、模块拆分原则

    2.1、高内聚性

    高内聚性用于描述模块内各功能的调用关系。高内聚性是指模块内所有接口、接口层级调用的紧密程度。这些被紧密集合在一起的工作逻辑对外是透明的,且只为一个目标而存在,就是从模块内所处不同层次出发,共同完成业务模块所负责的单一业务任务。

    例如,业务模块中的数据层只是为了完成和业务相关的数据的持久化存取存在的,不会在数据层去存取和另外业务相关的全部数据。业务模块中的业务逻辑层,只是为了完成和本业务逻辑相关的计算,其余周边业务的处理要么调用其它模块的接口完成,要么通过事件机制将自身处理情况通知出去,再由其它模块的订阅者负责完成……。
    在这里插入图片描述
    高内聚性在帮助开发人员提高开发效率的前提下,还可能导致循环依赖。循环依赖不一定完全是坏事,这要看技术团队对业务拆分的理解和要求。例如如果研发团队根据需求调研决定将用户、岗位、职位、职级归纳于一个模块,那么用户、岗位、职位、职级的逻辑关联实现就不必考虑避免四个功能需要单独形成四个模块的问题,也无需考虑循环依赖的问题(但实际情况来看这种模块粒度的设计显然太过粗放)。

    2.2、低耦合性

    耦合性用于描述模块和模块间的关联紧密程度。模块依赖的外部模块越多、需要关注的其它模块的事件越多,则模块的扩展难度越大、替换成本越高。从系统设计的角度来看,降低功能模块的耦合性比提高模块内的聚合性更为重要。这个原因很容易理解,模块内的聚合性是否紧密仅仅涉及到该模块本身设计的好坏,而模块间的低耦合性将保证模块内不好的设计所影响的范围被限制在模块内,而不会被传递到其它模块。

    2.2.1、为了达到低耦合性的要求,有几类模块间的关联方式是绝对需要避免的:

    • A、直接跨过其它模块的标准接口,对其它模块的数据进行读写:这个原因很好理解,这种修改方式将直接取决于其它模块的业务实现细节,如果其它模块的业务逻辑在内部被修改或者其他模块的实现方式直接被替换,那么本模块内的相关处理逻辑则不得不进行修改。这种处理方式也违背了面向对象设计的基本原则——依赖接口而非依赖实现。以下是一个错误示例:
      在这里插入图片描述
    • B、两个或多个模块都对同样的业务进行操作:这种场景常见于两个或者多个模块进行数据绑定的情况。例如,物流模块中货运单负责人和用户模块中人员进行绑定关联的操作场景。一个非常明显的问题是:到底应该由哪个业务模块来控制这个绑定关系?

    注意:本文一直讨论的是功能模块的设计问题,而不是用户UE交互问题。在UE层面,从方便用户操作的角度来看当然可以在用户模块提供一个直接绑定货运单的操作界面,但是在功能模块设计层面,对于绑定信息的操作当然不能设计成两个模块都可以管理绑定数据。正确的设计方式是,只能由上层模块完成绑定数据的维护(也就是归纳到上层功能模块中进行管理)。如下图所示:
    在这里插入图片描述
    这是为什么呢?首先讨论这个问题的前提是,功能模块的拆分满足要求(即上文以讨论过的功能模块应该具备的所有特性)。在这种情况下,具有这种数据绑定关系的功能模块一定具有单向依赖特点。

    将两个业务模块的绑定关系(特别是多对多关系)放置于上层模块,可以使下层模块减少关注规模、保证下层模块的稳定性,还可以增加上层模块的扩展性。例如如后续需要增加订单创建者的数据绑定关系,则无需修改用户模块,只需要增加新的订单模块。
    在这里插入图片描述
    如果设计者发现无法确定某种绑定关系不知道应该放置在哪个功能模块中,则最可能的原因是:这两个或者多个功能模块拆分失败,需要重新进行功能模块设计。或者这些关联数据是功能模块内具有内聚性的绑定信息。那么有的读者会问,如果将绑定关系交给上层模块维护,当时又需要在查询用户信息时一起关联出指定用户和物流单绑定,该怎么办呢?不要急,后续讲解如何进行模块拆分时会进行解决方式的讲解。

    2.2.2、另一种场景的模块间依赖方式,是应该尽可能减少或被限制的:

    将两个或者多个设计存在瑕疵的功能模块中存在循环依赖的部分提取出来下沉为一个诸如common-XXXX的公共功能模块。如下图所示:
    在这里插入图片描述
    这里的common模块当然是一种解决多个模块中依赖冲突的办法,但是作为下沉的功能模块,该模块存在一些问题:首先该模块一定会涉及应该由其它功能关注或操作的业务逻辑,所以该办法治标不能治本。而最根本的原因是这个办法将功能模块间的循环依赖问题迁移到这个公共模块的内部,让循环依赖以内聚性的方式继续存在,而不是解决这一系列循环依赖。

    另外,上层功能模块依赖该公共模块后,会将上层功能模块无需关注的接口、模型、事件暴露出来,增加上层模块的开发难度。最后,增加了一个无法归入任何特定功能模块的所谓公共功能模块,一定会增加业务系统本身的维护难度,而在后续的二次开发环节中,开发人员对于是否需要引入、修改这个公共模块一定会存在疑惑。

    2.2.3、好的低耦合设计将直接帮助系统设计达到一下几个效果:

    • A、更容易的二次开发实施
      这个效果用一个通俗易懂的方式进行描述,就是:好的功能模块可以在二次开发阶段由二次开发团队按照自己的需求思路和技术思路进行完全重构,且这样的二次开发是有明确边界的,这个边界应该和被二次开发替换模块的功能边界一致。二次开发团队在进行功能模块重写时,无需关注这个模块以外的模块工作原理,因为其他模块不会因为这次重写而发生改变。

    • B、功能模块层级明确
      在产品团队在进行前期产品设计或者对客户的售前工作中,经常会向团队或者目标客户出示产品的功能架构图,类似如下:
      在这里插入图片描述
      那么技术团队能否在产品/项目研发阶段真正按照这样给客户宣讲(忽悠)的功能架构图完成系统中各个功能模块的构建呢?答案是肯定的,只要按照上文提到的构建功能模块的基本原则进行系统设计,那么系统中的各个模块就可以呈现“漂亮”的顺序依赖结构。但很多时候,由于错误的功能模块拆分方式,技术团队往往无法达到产品前期设计的或者给客户承诺的功能模块拆分目标。

    • C、具有单向依赖特点和层次特点的功能模块,自身是稳定的

      这种稳定性体现在代码修改、替换的边界控制上。举个例子:当开发人员出于某些目的,需要将某个模块的实现代码删除/剪切(除暴露的接口),那么开发人员可以观察到的效果是当开发人员剪切了模块的所有代码到另外的地方,该模块本身不会报错;同样该模块原始存在的应用工程也不会报错。

      这种稳定性还体现在模块内错误的可控性——系统内的虫子被有效限制:系统研发过程中难免出现技战术问题和失误,例如边界校验问题、性能问题、需求理解问题、数值适配问题等等(bug)。但是由于好的功能模块设计的内聚性和隔离性,这些虫子活动范围只会限于各个功能模块内部。

    3、如何进行模块拆分

    那么如何进行功能模块的拆分呢?上文已经提到,功能模块拆分的原则是提搞功能模块的内聚性,降低功能模块间的耦合性。其中更重要的原则是降低模块间的耦合性,高内聚性的形成则降低模块间耦合性后的必然产物。

    3.1、基于不同业务场景,使用规范的设计模式,降低依赖:

    模块间的耦合可通过多种设计模式(主要是行为模式)进行降低(但需要注意,采用设计模式的最大原则是,同一类型问题采用相同的设计模式进行设计),最好各个模块只存在最少方法调用、最小对象传参这样的依赖方式,最小限度来说必须解决功能模块间的循环依赖问题。请看如下示例:岗位模块和用户模块由于设计问题被耦合在一起,两者存在循环依赖——这是两个坏的模块设计:

    // ……
    // 岗位模块逻辑实现中依赖了用户模块的接口
    public class PositionServiceImpl implements PositionService {
      @Autowired
      private UserService userService;
      public void doSomething() { }
    }
    // ==============
    // 用户模块的逻辑实现中依赖了岗位模块的接口
    // ……
    public class UserServiceImpl implements UserService {
      @Autowired
      private PositionService positionService;
      public void doOtherthing() { }
    }
    

    在没有解决循环依赖问题前,两个模块是分不出来业务层级的。如下图所示:
    在这里插入图片描述
    为了将两个模块进行最低限度的解耦,分出两个模块的层次,技术人员需要让两个模块的依赖关系变成单向的,如下图所示:
    在这里插入图片描述
    由于用户模块被其他功能模块调用的可能性要高于岗位模块,而且用户模块更需要进行抽象,所以一般认为用户模块应该位于岗位模块的下层(但这也不一定,决定于实际场景下的需求情况)。换句话说,岗位模块可以依赖用户模块,可以使用用户模块的SDK层(接口层)接口、模型;但是用户模块不应该依赖岗位模块,甚至不应该知晓用户模块上层的任何模块(包括岗位模块)的存在。

    从技战术的角度讲,我们只需要一些很简单的办法,就可以解决这个问题:即在用户模块提供事件通知,将用户模块工作逻辑中需要由上层模块协作完成的事件触发点公布出去,然后由上层模块按照相关需求进行实现即可。这个过程可以使用监听器模式、观察者模式等等,另外spring框架本身提供的事件订阅机制,技术人员也可以使用(这里就不再铺展开讲解了,感兴趣的读者可以参看本专题后续文章,也可以参考其他第三方资料)。示例代码如下:

    /**
     * 用户模块中定义的事件信息,注意用户模块只是定义事件,而事件的实现交由上层模块进行
     * @author yinwenjie
     */
    public interface UserEventListener<T> {
      /**
       * 当用户模块完成新的用户信息创建时,该事件会被触发
       */
      public void onUserCreated();
      /**
       * 当用户模块由于某些原因,需要知晓上层功能模块中,业务信息和指定用户(多用户)的绑定情况时,
       * 该事件会被触发 
       */
      public List<T> onUserBandingInfoRequest(String account);
    }
    

    进行依赖倒转的本质是将本模块和其他模块逻辑相关的所有实现,由下层模块迁移到上层模块。例如以上示例中,将原有用户模块中直接调用的岗位实现逻辑迁移到岗位模块内部。这样,上层业务模块的逻辑情况就对下层模块透明了。岗位功能模块可以根据自身的情况,对这些事件进行实现(订阅),示例代码如下:

    // 岗位模块逻辑实现中依赖了用户模块的接口
    public class PositionServiceImpl implements PositionService , UserEventListener<YourBusiness> {
      // 用户模块不需要知晓岗位模块的存在
      // 只需要岗位模块依赖用户模块
      private UserService userService;
      public void doSomething() {
      }
      @Override
      public void onUserCreated() {
        // ..... 
      }
      @Override
      public List<YourBusiness> onUserBandingInfoRequest(String account) {
        // 根据岗位模块中的具体逻辑进行该事件实现
        return null;
      }
    }
    

    3.2、为功能模块规划标准的调用边界

    所有上层模块对其的调用,只能通过边界进入该功能模块。为了适应各种调用场景,支持功能模块的单向依赖,并统一功能模块边界的数据描述,功能模块的调用边界至少应该包括:标准的调用接口,标准的调用接口只有处于功能模块的上级模块才能直接使用,换句换说一旦外部功能模块直接调用了本功能提供的调用接口,那么外部功能模块一定处于该功能模块的上级;标准的模型定义,标准的模型定义规范了外部功能模块向该模块传递信息的统一要求,也规范了该模块向外部功能模块返回的处理结果(这类模型一般包括枚举信息,包括VO模型或DTO模型,一般不使用Entity进行描述);标准的事件定义,为了保证该模块能向上层模块通知自身的数据变化和逻辑处理要求,功能模块必须定义进行事件定义。

    3.3、模块实现应于模块边界分离

    功能模块有了明确的功能边界后,就为功能模块建立了一堵墙将模块外部和模块内部进行隔离,并且在墙上开了一道门。门外不需要知道门内的具体逻辑实现,而门内可以有若干种具体实现。换句话说,门内的具体实现也应该和这堵墙进行分离,以便应用系统可以在构建时选择需要哪种实现,如下所示:
    在这里插入图片描述
    Spring Boot中提供的组件开发模式(注意是组件开发模式,而不是插件开发模式),可以帮助设计人员快速实现这种分离场景的要求(这里不再展开,有兴趣的读者可参看本专题后续文章)。并且任意第三方对于功能模块的调用都需要通过门进入,如下图所示:
    在这里插入图片描述

    3.4、数据耦合和参数耦合是最低的耦合形态,应该尽可能使用

    降低模块间的耦合,并不是全面去除模块间的耦合,后者的理解是不科学的也不现实。需求要求的功能,需要两个或者多个模块配合完成,这些模块间当然就一定会有耦合。脱耦的关键目标在于明确功能模块的边界,在于将“你”要处理的内容和“我”要处理的内容分割清楚,在于可以达到就算没有“你”或者换一个“你”那么“我”也可以完整处理“我”负责内容的目的。

    要达到这个目标,就需要考虑如何进行耦合,很明显直接进行接口调用或者处理逻辑调用是不行的,而使用关键数据进行模块关联(数据耦合)并利用局部参数传递数据(参数耦合),可以有效减少两个模块的耦合程度。

    用一句很好理解的话来解释:模块和另一个模块耦合时,只在本模块中记录另一个模块的关键数据而不是全部数据,尽可能少记录另一个模块在本模块中的冗余数据,这样做的目的是保证就算另一个模块的具体工作逻辑被替换掉,本模块也可以根据这些关联数据精确驱动另一个模块的处理过程;而数据的传递和驱动要求的传递,通过局部参数或者对象属性完成,这保证了另一模块的处理逻辑不会牵扯另一模块中的其他逻辑处理过程。

    3.5、文档支持

    为了便于研发团队内部进行模块开发级别的交流,也便于二次开发团队了解模块的具体作用、使用方式、注意事项,软件研发过程特别是产品级别的软件研发过程,研发团队必须使用文档进行功能模块层面的描述。

    注意,这里说的是功能模块级别的描述,而不是具体业务实现逻辑的描述过程。这两份文档的区别主要体现在对不同技术层级的描述。具体业务实现的描述可以撰写成功独立文档,更推荐直接使用规范化的代码注释进行描述;而功能模块级别的文档必须独立成文,并使用利于团队交流的知识库系统进行管理。

    功能模块级别的文档至少应该描述以下事实:该模块在整个应用系统中的位置、该模块下层(直接)依赖了哪些模块以及原因、该模块提供了暴露的调用接口和事件订阅方式、该模块的在应用系统级别的引入方式等等。

    注意,相当一部分技术人员不习惯于写文档,或者说不知道如何写文档。为了在研发团队的磨合期帮助这部分技术人员上手文档写作,研发团队可以出具一份切实可行的文档模块,将文档分为几个段落并明确每个段落的写作要点、要求和示例,帮助引导技术人员的写作思路。以下为某产品研发过程中使用的模块描述文档的模板范例:
    在这里插入图片描述

    4、实际功能模块拆分举例

    下面以一个实际例子进行举例,两者相关联的业务需求点是:创建一个新的订货信息时,需要验证订货者是否还有未完成的退货单,如果有则不允许进行订货单创建。另外退货单创建时必须有关联的订货单,且订货单的状态必须是“已完成”,退货单创建过程中必须将对应的订货单置为“失效退货”状态。

    从需求层面上看,这两个模块的功能就应该是耦合在一起的,但这里要明确的是,作为研发团队我们不可能要求客户修改需求,而业务需求间的耦合并不是技术层面的耦合,研发设计的目的就是将业务需求解耦,转变为方面维护的一个一个独立功能模块。

    在没有进行好的模块化功能设计前,本系统中的订货功能和退货功能确实也是强耦合的方式撸(码)在了一起,如下所示:

    // 订货模块有如下代码
    // 退货单服务
    @Autowired
    private ChargebackService chargebackService;
    
    @Transactional
    public void create(OrderInfo orderinfo) {
      // ......
      // 验证订货者是否有未完成的退货单
      String account = orderinfo.getAccount();
      Set<ChargebackInfo> chargebackInfos = this.chargebackService.findByAccountAndStatus(account , Status.Enable);
      Validate.isTrue(CollectionUtils.isEmpty(chargebackInfos) , "订货者还有未完成的退单,不允许新建订货单!");
      // ......
    }
    
    // =====================
    
    // 退货单模块有如下代码
    // 退货服务
    @Autowired
    private OrderInfoService orderInfoService;
    @Transactional
    public void create(ChargebackInfo chargebackInfo) {
      // ......
      // 验证退货单的订单关联信息
      String relationCode = chargebackInfo.getRelationCode();
      OrderInfo exsitOrderinfo = orderInfoService.findByCodeAndStatus(relationCode);
      Validate.notNull(exsitOrderinfo , "未发现指定的订单信息!!");
      Validate.isTrue(exsitOrderinfo.getStatus() != Status.DONE  , "指定订单还未完成处理,不能进行退货!");
      
      // ...... 继续做退货单的其他处理
      // 然后在退货单模块,直接调用订单模块的接口,修改订货单状态
      this.orderInfoService.updateStatus(relationCode , Status.DONE);
      // ......
    }
    

    以上的示例代码是开发人员在实际系统开发过程中,编写的再简单不过的业务代码了。从需求的角度看这段代码没有问题,可以这样理解以上业务代码:就是开发人员按照需求人员对需求的描述,直接翻译成代码“贴”到应用系统中。从编码规范来看以上代码也没有问题:使用统一的命名规范、格式规范,有统一的边界校验控制,甚至使用统一的工具和编写技巧尽可能减少代码规模(这里特别说明一下,一些开发人员喜欢在开发过程中编写许多通用工具,例如字符串处理工具、日期处理工具、数值计算工具,并设想开发团队中的其他开发人员会使用这些工具,形成所谓的规范。这种做法是不科学、有危害的,原因会在本专题的后续文章中进行说明)。

    但是,以上代码从系统设计的角度看就存在问题了:订货单模块和退货单模块出现了强依赖,两个模块被循环依赖在了一起。如果产品团队根据需求分析最终决定订货模块和退货模块就应该是一个模块,那么这样做当然也没有什么大问题(就是后续要拆分成更细粒度的模块,会耗费大量工作),因为按照本文所述循环依赖只能存在于功能模块以内,如果循环依赖出现在模块间那么就证明模块拆分失败。

    在这里插入图片描述
    但是在本示例中,退货模块和订货模块显然属于两个需要独立工作的模块,那么必须通过系统设计的方式,降低这两个模块的耦合性,至少需要将两个模块的依赖方式变成单向依赖,将两个模块的耦合度降低到只有数据耦合和参数耦合。

    在进行设计前,我们先来确定一下这两个模块更科学的依赖方向:显然订货模块放置到更下层,可以使系统的依赖关系更科学,因为按照业务需求订货模块还将被除了退货模块以外的多个模块所依赖。如下图所示:
    在这里插入图片描述
    最终我们确认的模块拆分方案是:订单模块不应该引入任何退货模块的接口,甚至订单模块就不应该知道有一个退货模块。那么如何去掉订单模块中关于相关退货逻辑的处理呢?如何反转订单所依赖的退货单接口?

    设计模式中多种行为模式可以解决这个问题,最简单的方式就是为订单模块设计规范的事件接口,然后由上层模块根据自身业务需求实现这些事件(监听器模式/观察者模式)。我们先为订单模块定义标准的事件:

    /**
     * 订单事件,这个事件的定义在订单模块中
     * @author yinwenjie
     */
    public interface OrderEventListener {
      /**
       * 当订单被创建时(但本地事务还没有提交前),该事件被触发
       * @param orderInfo 本次新建的订单信息,通过参数方式进行传入
       */
      public void onCreated(OrderInfo orderInfo);
    }
    

    但是订单模块并不负责实现这些事件。接着,订单在自身的创建动作完成后,进行事件的触发,代码如下所示:

    // 订单模块的代码如下
    /**
     * 订单事件监听,之所以是集合,是因为可能有多个监听器的实现
     */
    @Autowired(required = false)
    private List<OrderEventListener> orderEventListeners;
    @Transactional
    public void create(OrderInfo orderinfo) {
      // ......
      // 在订单边界校验、自身处理过程完成后,触发事件
      if(!CollectionUtils.isEmpty(this.orderEventListeners)) {
        this.orderEventListeners.forEach(item -> item.onCreated(orderinfo));
      }
      // ......
    }
    

    这样的设计也基本能满足上文提到的进行模块设计的规范要求,特别是进行两个模块耦合的要求:首先采用监听器模式解决两个模块的循环依赖问题;然后退货单无论是直接调用订单的接口,还是实现订货模块的事件订阅都遵循订单模块向外暴露的标准边界(门),完全避免了和订单模块内的任何具体实现逻辑产生关系;最后退货模块和订单模块的耦合仅限于调用方法时传递的参数(事件中传递了订单对象信息),且退货单模块仅关联订单模块中的订单业务编号(在退货单模块中,该属性称为“第三方业务单据relationCode”),关联的目的是帮助订单模块的处理过程精确定位到相关的单据信息。

    这样一来,订单模块只需要将自身发生的变动的情况或者需要获取数据的事件发布出去,无需知道有哪些模块会订阅这些事件(订单模块除了数据层面、参数层面和各个上层模块有耦合以外,订单模块压根不知道有哪些上层模块会订阅事件,更谈不上知晓这些模块的作用)。
    在这里插入图片描述
    关键代码如下所示:

    // 此段代码是模块改造后,退货模块的代码示例
    // 该服务实现了订单模块的OrderEventListener监听接口
    public class ChargebackServiceImpl implements ChargebackService ,  OrderEventListener {
      
      @Override
      public void onCreated(OrderInfo orderInfo) {
        // 之前退货单放置在订单模块的代码放到了这里
        // 具体来说就是,验证订货者是否有未完成的退货单
        String account = orderinfo.getAccount();
        Set<ChargebackInfo> chargebackInfos = this.findByAccountAndStatus(account , Status.Enable);
        Validate.isTrue(CollectionUtils.isEmpty(chargebackInfos) , "订货者还有未完成的退单,不允许新建订货单!");
        // ...... 其它处理逻辑过程
      }
    }
    

    这是最简单的一种设计模式的应用方式。在这里如何进行事件的发布或者如何进行实现者行为的控制,完全取决于技术人员对需求的抽象能力,以及将抽象需求转换为设计思路的能力。再例如,当事件发生时系统中会有多个实现,但是只能按照条件选择一个最合适的实现进行调用,那么可以使用策略模式进行设计,如下所示:

    
    /**
     * 订单事件处理策略定义
     * @author yinwenjie
     */
    public interface OrderCreateEventStrategy {
      /**
       * 该方法将在订单创建事件发生后,首先被触发,
       * 系统将根据该方法的返回情况,确定是否使用该策略匹配本次订单创建后的处理逻辑
       * @param orderInfo 本次进行创建的订单
       * @return 如果返回true,则表示该处理策略逻辑将被正式执行;其他值,不执行该策略实现逻辑
       */
      public boolean isHandler(OrderInfo orderInfo);
      /**
       * 只有当本策略实现的isHandler方法返回true,该方法才会执行
       * @param orderInfo 本次进行创建的订单
       */
      public void onCeated(OrderInfo orderInfo);
    }
    

    接着本文再举一个例子:如果需要将事件的实现行为串起来执行,且需要按照业务逻辑对执行顺序进行管理,那么可以使用责任链模式进行设计(注意,责任链模式建议使用递归而非循序进行控制,最好准备责任链的上下文管理器[完全可以参考Servlet中filter的设计思路])。关键接口示例如下:

    /**
     * 订单模块为了事件处理,定义的责任链抽象类。
     * 事件策略逻辑过滤
     */
    public abstract class OrderEventFilter {
      /**
       * 该方法将在订单事件触发时,参与逻辑处理链
       * @param orderInfo 当前发生事件的订单
       * @param event 事件类型,包括DELETE,CREATE,UPDATE ......
       * @param orderEventHolder 订单事件管理器,是否进行后续处理或处理过程的上下文,由该对象控制
       */
      public abstract void handler(OrderInfo orderInfo , Event event , OrderEventHolder orderEventHolder);
    }
    

    有的读者会问,这些原则和示例是否只适用于单应用系统,如果应用系统是微服务架构又该怎么办呢?微服务架构同样需要遵从功能模块设计的原则,实际上本文的内容已经足可以帮助读者扩展出微服务系统下的模块构建方式。不过微服务系统由于涉及进程间通信,所以需要增加在另一些关键技术方案上的突破,例如如何保证多进程间的数据一致性(传统的基于数据库的分布式事务一定是不行的)、再例如怎么控制进程间的消息订阅和发布等等。这些坑在本专题的后续内容中将逐步填上。

    另外,本专题后续文章也会逐渐讨论与二次开发相关的实施方案,包括但不限于如何在功能模块内部完成开发(这种场景经常出现在以项目驱动的产品研发过程中),如何替换功能模块,如何将单一化应用系统改造为微服务系统等等。

    展开全文
  • 导读:电商业务与我们的生活息息相关,大家可能对电商多少也有一些了解,事实上,即使是一个最小化的电商系统,也依然是非常复杂的。所以,我们先花一点时间,一起以一个创业公司的CTO的视角,设计一...

    导读:电商业务与我们的生活息息相关,大家可能对电商多少也有一些了解,事实上,即使是一个最小化的电商系统,也依然是非常复杂的。

    所以,我们先花一点时间,一起以一个创业公司的CTO的视角,设计一个最小化的电商系统,并以此理清电商系统的架构。让大家对电商系统的业务逻辑、系统架构、核心业务流程有一个基本的认知。

    作者:李玥

    来源:大数据DT(ID:hzdashuju)

    7e23941dc42dc026d373fbc74c67d94a.png

    新公司很快就成立了,你成了新公司的CTO。关于改变世界,目前唯一能确定的是,首先要做一个电商系统。具体要做成什么样,目前还不清楚。你需要与老板讨论业务需求。

    • 你:“咱们要做的业务模式是C2C、B2C还是B2B呢?”

    • 老板:“什么B?什么C?我不懂你说的那些技术名词。”

    • 你:“这么说吧,你要做一个某宝网,还是某东网,还是某848网呢?”

    • 老板:“不都是一样的吗?它们之间有什么区别?你赶紧做一个出来我看看不就知道了?!”

    故事发展到这里,作为程序员的你是不是有一种似曾相识的感觉?现实就是,需求永远不明确,永远在变化,唯一不变的只有变化。优秀的程序员适应变化,并且拥抱变化。在需求还不太明确的情况下,比较可行的方案就是,首先搭建不太会发生变化的核心系统,然后尽量简单地实现一个最小化的系统,后续再逐步迭代和完善。

    01 设计电商系统的核心流程

    接下来,我们一起设计这个电商的核心系统。

    遵照软件工程的一般规律,我们先从需求阶段开始。那么,需求分析应该如何做呢?理想情况下,系统分析师或产品经理应该负责完成需求分析的任务。但是,现实中绝大多数情况下,你得到的所谓的“需求”,很有可能就是一两句话。需求分析的工作最终往往是由开发者完成的。

    很多项目交付以后,仍需要不断地进行修改和变更,用户不满意,开发者也很痛苦,造成这个问题的根本原因其实就是缺失了需求分析的步骤。所以,为了后续工作能够顺利开展,每位开发者都应该掌握一些用于需求分析的方法。

    那么,开发者进行需求分析时应该做些什么呢?这里先不介绍那些做需求分析的方法和理论,只告诉你最重要、最关键的一个点:不要一上来就设计功能,而是先明确下面这两个问题的答案。

    1. 这个系统(或者功能)是给哪些人用的?

    2. 这些人使用这个系统是为了解决什么问题?

    这两个问题的答案,我们称之为业务需求。那么,对于我们将要设计的电商系统,其业务需求又是什么呢?如果大家很熟悉电商的业务,那么回答这两个问题应该很容易。

    第一个问题,电商系统是给哪些人用的?首先是买东西的人,即“用户”;其次是卖东西的人,即“运营”;还有一个非常重要的角色就是出钱的人,即“管理者”(请记住,在设计任何一个系统的时候,管理者的意见都是非常重要的)。综上所述,电商系统是面向用户、运营和管理者开发的。

    第二个问题,用户、运营和管理者使用电商系统分别想要解决什么问题?这个也很容易回答,用户为了买东西,运营为了卖东西,管理者需要通过系统了解自己所得的收益。

    这两个问题的答案,或者说业务需求,稍加细化后,可以用图1-1进行清晰的表述。

    03a80e029d8e68af20f9548506a4e959.png

    ▲图1-1 电商系统用例图

    图1-1在UML(统一建模语言)中称为用例图(Use Case),是我们进行需求分析的时候所要画的第一张图。用例图可用于回答业务需求中的两个关键问题,即这个系统给谁用?他们用这个系统是为了解决什么问题?

    一般来说,业务需求与我们要设计的系统关系不大。为什么这么说呢?因为我们将图1-1中的用例,放在传统的商业企业(比如,一个小杂货铺、一个线下实体商场或商店,或者一个做电视购物的公司)中也是适用的,所以,做业务需求的主要目的是理清楚业务场景是怎样的。

    下面就来分析电商系统的业务流程。很显然,电商系统最主要的业务流程,一定是购物流程。购物流程很简单,具体流程如图1-2所示。

    所有电商的购物流程几乎都是如此,下面就来分析一下这个流程。

    cb68aba9a11ee86d9ab7d02256f123f5.png

    ▲图1-2 电商系统购物流程图

    流程从用户选购商品开始,用户首先在App中浏览商品,找到心仪的商品之后,把商品添加到购物车,选完商品之后,打开购物车,提交订单。下单结算之后,用户就可以支付了。支付成功后,运营人员会为已经支付的订单发货,为用户邮寄相应的商品。最后,用户收到商品并确认收货。至此,一个完整的购物流程就结束了。

    02 根据流程划分功能模块

    接下来,我们再进一步细化电商购物的业务流程,看一下电商系统是如何实现该流程的。图1-3所示的是细化之后的电商系统购物流程时序图(Sequence Diagram)。

    a9b25fb648c6cbb534ab4e24599be3c9.png

    ▲图1-3 电商系统购物流程时序图

    下面就来详细讲解图1-3所示的时序图中的各个步骤。

    1. 用户浏览商品,这个步骤需要通过一个商品模块来展示商品详情页,用户可以从中获取所浏览商品的详细介绍和价格等信息。

    2. 然后,用户把选好的商品加入购物车,这个步骤需要使用一个购物车模块来维护用户购物车中的商品。

    3. 接下来是用户下单,这个步骤需要基于一个订单模块来创建新订单。订单创建好了之后,系统需要把订单中的商品从购物车中删减掉。

    4. 订单创建完成后,系统需要引导用户付款,即发起支付流程,可通过一个支付模块来实现支付功能,用户成功完成支付之后,系统需要把订单的状态变更为“已支付”。

    5. 成功支付之后,运营人员就可以发货了,发货之后,系统需要扣减对应商品的库存数量,这个步骤需要基于一个库存模块来实现库存数量的变更,同时系统还需要把订单状态变更为“已发货”。

    6. 最后,用户收到商品,在系统中确认收货,系统需要把订单状态变更为“已收货”,流程结束。

    这个流程涉及5大功能模块,即商品、购物车、订单、支付和库存,这5大模块就是一个电商系统中的核心功能模块。

    当然,仅有这5个模块是不够的,因为我们只分析了“购物”这个最主要的流程,并没有完全涵盖业务需求中的全部用例,比如,运营人员进货、管理者查看报表等还没有覆盖到。

    相比购物流程,剩下的几个用例和流程都相对简单一些,我们可以采用同样的方法来分析其他的功能模块。这里将省略分析过程,直接给出我们所要实现的电商系统的功能模块划分(如图1-4所示)。

    e8fbb77ab20b3b7490bb969fb1a3fc52.png

    ▲图1-4 电商系统功能模块划分

    图1-4使用了UML中的包图(Package Diagram)来表示电商系统的功能模块。

    整个系统按照功能,可以划分为10个模块,除了购物流程中涉及的商品、订单、购物车、支付和库存这5个模块之外,还补充了促销、用户、账户、搜索推荐和报表这5个模块,这些都是构建一个电商系统必不可少的功能模块。下面就来逐一说明每个模块需要实现的功能。

    1. 商品:维护和展示商品的相关信息。

    2. 订单:维护订单信息和订单状态,计算订单金额。

    3. 购物车:维护用户购物车中商品的信息。

    4. 支付:负责与系统内外部的支付渠道对接,实现支付功能。

    5. 库存:维护商品的库存信息。

    6. 促销:制定促销规则,计算促销优惠信息。

    7. 用户:维护系统的用户信息,注意,用户模块是一个业务模块,一般不负责用户的登录和认证,这是两个完全不同的功能。

    8. 账户:账户模块负责维护用户的账户信息。

    9. 搜索推荐:提供商品搜索功能,并负责各种商品列表页和促销页的组织和展示,简单地说就是,搜索推荐决定用户优先看到哪些商品。

    10. 报表:实现数据统计和分析功能,生成报表,为管理者进行经营分析和决策提供数据信息。

    这里需要特别说明的是,促销模块是电商系统中最复杂的一个模块。各种优惠券、满减、返现等促销规则,每一条都非常复杂,再加上这些规则往往还要叠加计算,有时甚至会复杂到连制定促销规则的人都算不清楚。

    所有电商公司无一例外都曾因为促销规则制定失误,导致商品实际售价远低于成本价,使公司受到一定程度的损失。尽管如此,五花八门的促销活动依然是提升销量最有效的手段,因此需要充分利用。

    作为电商系统的设计者,我们需要把促销规则的变化和复杂性控制在促销模块内部,不能因为一个促销模块而导致整个电商系统都变得非常复杂,否则设计和实现将会很难。

    一种可行的做法是,把促销模块与其他模块的接口设计得相对简单和固定,这样系统的其他模块就不会因为新的促销规则改变而随之进行改变。

    在创建订单时,订单模块需要把商品和价格信息传给促销模块,促销模块返回一个可以使用的促销列表,用户选择对应的促销和优惠,订单模块把商品、价格、促销优惠等信息,再次传给促销模块,促销模块再返回促销之后的价格。在最终生成的订单中,系统只需要记录订单使用了哪几种促销规则,以及最终的促销价格就可以了。

    这样,无论促销模块如何变化,订单和其他模块的业务逻辑都不需要随之改变。

    至此,我们就完成了一个电商系统的概要设计,大家对电商系统应该也有了一个初步的了解。

    03 小结

    下面就来回顾一下一个电商系统的设计中所包含的核心要点。

    首先,电商系统面向的角色是:用户、运营人员和管理者。这三个角色对电商系统的需求是:用户通过系统来购物,运营人员负责商品的销售,管理者关注系统中的经营数据。

    电商系统最核心的流程是用户购物的流程,购物流程从用户浏览选购商品开始,加购、下单、支付、运营人员发货、用户确认收货,至此电商系统的购物流程结束。

    细化这个流程之后,我们可以分析出支撑这个流程的核心功能模块:商品、订单、购物车、支付和库存。除此之外,一个完整的电商系统还包括促销、用户、账户、搜索推荐和报表这些必备的功能模块。

    作为一名开发者,在做需求分析的时候,需要把握的一个要点是:不要一上来就设计功能,而是要先理清业务需求。这也是本文反复强调的两个问题:这个系统是给哪些人用的?他们分别用这个系统来解决什么问题?这样就可以确保做出来的系统大体上不会偏离用户的预期。

    最后,在讲解系统功能模块划分的时候,介绍了一个能够有效降低系统复杂度的设计经验。那就是,如果系统业务是复杂而多变的,那么请尽量识别出这部分复杂业务的边界,将复杂业务控制在一个模块内部,从而避免将这种复杂度扩散到整个系统中去。

    关于作者:李玥,美团基础技术部高级技术专家,极客时间《后端存储实战课》《消息队列高手课》等专栏作者。曾在浪潮集团、当当网、京东零售等公司任职。从事互联网电商行业基础架构领域的架构设计和研发工作多年,曾多次参与双十一和618电商大促。专注于分布式存储、云原生架构下的服务治理、分布式消息和实时计算等技术领域,致力于推进基础架构技术的创新与开源。 

    本文摘编自《电商存储系统实战:架构设计与海量数据处理》,经出版方授权发布。(ISBN:978-7-111-69741-1)

    1c3905103206a47e670de478982c13a7.png

    延伸阅读《电商存储系统实战》

    点击上图了解及购买

    转载请联系微信:DoctorData

    推荐语:基于实战案例系统讲解电商系统的存储设计,详细分析不同规模存储系统的构建方法。

    96820a4ff8875953ed1c0ed47bf67652.gif

    划重点👇

    干货直达👇

    更多精彩👇

    在公众号对话框输入以下关键词

    查看更多优质内容!

    读书 | 书单 | 干货 讲明白 | 神操作 | 手把手

    大数据 | 云计算 | 数据库 | Python | 爬虫 | 可视化

    AI | 人工智能 | 机器学习 | 深度学习 | NLP

    5G | 中台 | 用户画像 数学 | 算法 数字孪生

    据统计,99%的大咖都关注了这个公众号

    👇

    展开全文
  • 浅谈MES系统质量管理功能模块

    万次阅读 2021-01-27 13:35:46
    MES系统质量管理模块,完成了制造业务和质量管控全过程的自然融合,保证了质量活动与制造全过程的完美交互,制造全过程中全部静态和动态的数据信息在系统中,伴随着制造业务的深入开展,顺理成章地从各个环节被自动...

    MES制造执行系统中质量管理模块是整个MES系统中不可或缺的分系统之一。MES系统质量管理可以符合客户的需求、保证合规性,同时降低质量成本。

    MES系统质量管理模块,完成了制造业务和质量管控全过程的自然融合,保证了质量活动与制造全过程的完美交互,制造全过程中全部静态和动态的数据信息在系统中,伴随着制造业务的深入开展,顺理成章地从各个环节被自动采集,生成庞大的制造数据信息,为质量活动的设计、实施、评价和改进带来了丰富的数据信息基础。

    在这里插入图片描述

    MES制造执行系统中的产品质量管控、质量分析等功能模块对自动采集取得的大量数据进行筛选、分析与反馈调节,同时建立数字化为特性的企业车间产品质量管理体系,可以合理地提升质量管控活动的实行效率,使得制造流程的产品质量反应能力和产品质量控制能力取得极大的提高。

    MES制造执行系统拥有质量控制计划,全部质量检查均记载在系统中,以带来问题的可视性,持续改进的数据信息并支持客户的审查。SPC功能模块可根据实时趋势和警报科学、合理地管控流程,精确测量过程能力,从而保证产品质量。MES制造执行系统带来准确的数据信息,以调研根本原因和管控问题。

    品质现象资料管理

                                                         品质现象资料管理
    

    MES产品质量运营管理基本功能具体包含下列多方面:
    1、产品质量
    产品质量管理软件准许在生产线或实验室中搜集数据信息。向操作人员发送提醒,进行质量控制体系,对问题作出响应并考量一致性。
    2、SPC
    精确测量流程变化,掌握过程能力并减少流程变化影响的工具软件。数据可视化SPC图表并将SPC数据信息加入到一致性资格证书。
    3、流程监控
    应用MES系统的内置历史记录软件监控流程参数。根据图表数据信息深入地了解该流程,提高追溯性。
    4、连接到文档
    快速访问您需要的全部文档,比如SOP,CAD图,产品规格文档,产品质量程序。保证每个人都会在应用最新版本进行工作。
    5、关注与CAPA
    加快未达标问题的处理。记录,跟踪和记录不符项,直到处理。
    6、客户投诉举报
    记录,调研和管控客户投诉,提高解析效率,制订问责制和最佳实践,提高客户满意度。
    7、供应商投诉与举报
    提高供应商的绩效。记录,调研和管控供应商的不符项,建立无纸记录用于支持投诉举报,管控索赔。

    质量追溯

                                                             质量追溯
    

    MES制造执行系统产品质量运营管理,基本完成了产品质量规范信息的传递、质量检验、质量控制等产品质量管理职能,健全了产品质量管理手段,提高了质量管理的能力。同时,在应用流程中加强质量管理基础建设,健全产品质量管理制度,规范产品质量管理流程,提高MES制造执行系统运行与质量管理实际职能的集成能力,是保证MES制造执行系统与质量管理达到高效整合的关键。

    安达发MES制造执行系统,一个开放式的MES系统代表,既有适合大中型制造企业,也有适合中小型企业的C1智能制造管理软件,同时拥有机加MES、注塑MES、电子MES、电线电缆MES等解决方案,是制造业生产管理值得推荐的MES制造执行系统。

    MES制造执行系统解决方案

                                                         MES制造执行系统解决方案
    

    安达发能提供全面、高效的企业信息化解决方案,涵盖业界最优秀的APS高级计划排产、MES系统和WMS智能仓储,完美实现计划、排产、执行、履约、仓储闭环,是真正意义上的软件+硬件+管理的一体化解决方案,助力制造业数字化转型,成就智能制造发展新动能,实现卓越制造。

    展开全文
  • ARM内核有4个功能模块T、D、M、I,可供生产厂商根据不同用户的要求来配置生产ARM芯片。  其中:T功能模块表示16位Thumb,可以在兼顾性能的同时减少代码尺寸。M功能模块表示8位乘法器。D功能模块表示Debug,该内核...
  • 计算机操作系统的五大功能是什么

    千次阅读 2021-07-18 03:03:59
    计算机操作系统的五大功能操作系统功能主要体现在对计算机资源――微处理器、存储器、外部设备、文件和作业五大计算机资源的管理,操作系统将这种管理功能分别设置成相应的程序管理模块,每个管理模块分管一定的...
  • 032开发日志(用gojs来绘制模块关系图)
  • IP-guard全部22个功能模块简介

    千次阅读 2020-02-28 10:39:17
    IP-guard企业信息监管系统,是一款领先的内网安全软件,它能够协助企业解决最棘手的内网安全问题,借助IP-guard强大的功能,企业能够有效地进行用户行为管理,防范信息外泄,营造健康安全的网络环境,下面模块功能...
  • 前端模块系统

    千次阅读 2016-08-30 15:52:41
    它们运行在现代的高级浏览器里,使用 HTML5、 CSS3、 ES6等更新的技术来开发丰富的功能,网页已经不仅仅是完成浏览的基本需求,并且webapp通常是一个单页面应用,每一个视图通过异步的方式加载,这导致页面初始化和...
  • 一个电商项目的功能模块梳理

    千次阅读 2019-01-29 14:20:59
    一个电商项目的功能模块梳理
  • 说到我们技术系统,水平切分和垂直切分是什么? 最小划分到什么层级?答案: 最小的流程力度.可能会有进一步拆分出底层支持模块.比如帐户,比如券. 关于需求评审和设计拆分步骤: 如何识别模块. 生命周期法. ...
  • 常规功能模块自定义系统 (cfcmms)—015模块自定义概述(2)  模块的权限的自定义也是这个系统的重要部分。在本系统中现在模块的权限有三大类:模块操作权限、记录可视范围限定、附加操作权限。 模块操作权限:...
  • 常规功能模块自定义系统 (cfcmms)—014模块自定义概述  前面的章节讲了一些搭建系统和Extjs6的一些相关内容,这节开始介绍一下《常规功能模块自定义系统》中的模块自定义的部分。  本系统从最终的结果来看,...
  • 对于所有的有进取心的crud码农来说,如何完整部署一个项目,或者说一个分布式项目都是一个很有挑战性的任务。...1.如何使各模块间可以互相调用 ①首先,第一步是需要创建一个父项目(Maven创建,空项.
  • 平时学习一些编程相关的技术,除了买书看...当然了,记得初学编程的时候,大多就是去w3cschool和菜鸟教程学习,一来觉得实用性相对比较强,二来比较系统。 这周一在极客时间买了一个知识付费专栏叫做《从0开始学架...
  •  在整个自定义系统模块附加字段也是有必要的。对于一个模块来说附加的字段有二种,一种是父模块中的字段,另一种是子模块中的聚合字段。在模块记录生成sql语句的时候,只是生成了该模块的所有基本字段和其直接父...
  • 学生选课系统功能分析

    千次阅读 2018-10-23 20:50:12
    数据库系统:学生信息数据库 一、学生信息数据库主要有如下功能 1、用户能存储学生个人情况的有关信息。 2、用户能存储学生学习情况的有关信息。 3、用户能存储学生老师情况的有关信息。 4、用户能存储学生班级情况...
  • 如何编写一个模块化交易系统EA

    千次阅读 2020-05-29 10:24:06
    第一,重复的样板代码太多,有时一个EA的某个功能改了,你去修改另一个EA的时候,发现这个功能还得再改一遍,像这种情况,完全可以把一些通用的功能抽取出来,让所有EA都去依赖它就可以了,这样只用修改一处即可。...
  • 在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。 总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。...
  • 【OS笔记 9】操作系统内核的功能

    千次阅读 2020-08-18 10:25:03
    是指内核可以提供给OS的其它众多模块所需要一些基本功能,以便支撑这些模块工作。下面是三种最基本的支撑功能: (1)中断处理 此功能是内核最基本的功能,是整个操作系统活动的基础。OS中许多重要的活动无不依赖于...
  • 常规功能模块自定义系统 (cfcmms)—011选择菜单后的执行过程  菜单的生成具体见下面一段代码,getMenus获取第一层菜单的items,在getaMenu函数中用了递归来生成各级子菜单。在各个可执行的菜单条中加入了菜单...
  • 模块管理常规功能自定义系统的设计与实现(03--基本系统)
  •  在定义好了模块和字段这二个最基本系统元素之后,就可以开始其他功能的加入了。最先想到的功能应该就是grid了。  grid对应于某个模块。由于模块字段有很多,一个模块只有一个grid方案并不能满足需求,因此一个...
  • 下面我们就来一探究竟。 教务管理系统一般分为教师信息管理,班级信息管理,学生信息管理,课程信息管理,成绩信息管理,财务信息管理,打印信息管理,综合信息查询,系统管理。 1、教师信息管理:教务工作人员通过...
  • python自学篇——PyGame模块的所有功能函数详解

    万次阅读 多人点赞 2020-02-16 19:32:33
    PyGame是SDL多媒体库的Python包装器模块。它包含python函数和类,允许您使用SDL对播放cdroms、音频和视频输出以及键盘、鼠标和操纵杆输入的支持。 ☛点我一键到底☚ ????????????☝????????有疑问欢迎写信哦 游戏...
  • 系统由DS18B20温度传感器+MQ-2烟雾传感器+HC-SR501人体红外模块+SIM800C GSM模块+LCD1602显示屏组成。 (1)可检测环境温度、烟雾浓雾和人体信号并通过显示屏显示; (2)可通过按键设置报警值,当检测值超过报警...
  • 包括基本数据结构、动态数据结构、绘图函数、数组操作相关函数、辅助功能系统函数和宏、XML/YML、聚类、与OpenGL 的交互操作。  2、 Imgproc 图像处理模块  包括图像滤波、几何图像变换、混合图像变换、...
  • 扫地机器人逐渐走入千家万户,为我们的家居生活带来了极大的便利,一句话就能“吩咐”扫地机器人完成扫地甚至拖地的工作。...扫地机器人又称为智能吸尘器或机器人吸尘器,其系统可以分为四个模块,分别是移动...
  • 我们在进行系统架构设计时,往往将一个系统分解成若干个子系统,每个子系统又分解为若干个程序模块,分解后的子系统和程序模块都会执行一些相对独立的功能,在这里子系统也可以看作是较大的程序模块。分解后的这些子...
  • 今天,利用内核模块的方式向系统添加了一个内核模块。在make后,我开始sudo insmod hello.ko完成之后。老是出现killed,在lsmod后,发现hello这个模块已经加载上去,但是测试函数调用的时候,发现根本无法调用这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 399,894
精华内容 159,957
关键字:

下面属于系统基本功能模块