一、Veins介绍 我们先来了解一下Veins是什么。 Veins是一个开源的车联网模拟仿真框架,它为车联网络集成了一系列仿真模型。...这些模型在与车辆交通状况模拟器(SUMO)交互时运行在事件网络模拟器(OMNeT++)之上。Veins构建了一个模型框架,使得面向特定仿真模型的代码编程可以更加容易。...一句话概括来说,就是开源软件 SUMO 实现道路交通环境的模拟,具体包括仿真的路网环境、车辆运行等信息;OMNeT++实现通信网络的模拟和仿真;Veins 在 SUMO 和 OMNeT++的基础上构建了车联网的通信仿真框架...veins作为一个基于OMNeT++的框架,其便是由层次分明的ned文件组合而成的,如果学过面向对象编程的话可能会容易理解一些,这些ned文件就类似一个个类。...错误检测和处理:网卡能够在数据传输过程中检测并处理错误,例如校验和、重传控制等,以确保数据的正确传输。 电源管理:网卡具备电源管理功能,可以在计算机处于低功耗模式时关闭网卡,以节省能源。
软件工程复习 more important 模块独立性 模块独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块的接口是简单的。...高内聚低耦合 类间的关系 继承 继承关系表示子类重用父类的属性和操作,子类对象也是父类的对象,有时也称父类是子类的泛化。...,怎么理解 forth 模块独立性 是指软件系统中每个模块只涉及软件要求的具体子功能,而和软件系统中其他的模块的接口是简单的 耦合、内聚 耦合:模块之间的相互连接的紧密程度的度量 内聚:模块功能强度的度量...多模块可并行测试 测试任务 接口 局部数据结构 边界条件 独立执行通路 错误处理通路 集成测试 测试方法:常采用黑盒测试技术 策略: 非渐增式测试 渐增式测试 自顶向下结合 深度优先 广度优先 自底向上结合...风险识别 产品规模 商业影响 客户特性 过程定义 开发环境 建造技术 人员数量及经验 风险估计 奉献驾驭 CMM简单介绍 分级 初始级 可重复级 已定义级 已管理级 优化级 衡量软件工程 提高的参考基准
高质量的代码设计 1、合理的代码模块层级; 2、代码需综合考虑、约束:各模块的大小、模块的复杂度、接口的大小、模块之间的共享资源; 3、高内聚低耦合:消除重复功能代码、分离代码变化方向、缩小代码依赖范围...、向稳定的方向依赖; 4、代码统一的代码风格:代码样式的统一、命名风格统一、词汇的统一; 5、整洁代码:代码可读性高、没有坏味道、代码保存简单和直接原则、功能类或函数尽可能小; 6、熟悉开发语言和标准库函...:有符号和无符号混用检查; 12、避免代码逻辑漏洞。...2、代码度量检查:检测软件中代码的复杂度、代码嵌套的深度、代码扇入扇出度量(面向对象中扇入指的是派生类的梳理,面向对象中扇出指由一个类衍生出类的数量)、代码继承树的深度(DIT继承深度)、类的加权方法、...,应该把被依赖的多个模块合并为一个模块,进行重构依赖的接口; 6、类的继承树过深:应该考虑在代码的继承树的深度上是否有新的变化方向;考虑设计新的策略类,或设计其他模块实现优化继承树过深问题; 7、子类过多
A程序应简单、清晰、可读性好 B符号名的命名要符合语法 C充分考虑程序的执行效率 D程序的注释可有可无 49.下面不属于软件设计原则的是(C )。 A抽象B模块化C自底向上D信息隐蔽 50....力争降低模块接口的复杂程度。模块接口复杂是软件发生错误的一个主要原因。应该仔 细设计模块接口,使得信息传递简单并且和模块的功能一致。...注释事务:UML 中的解释部分,和代码中的注释语句一样,是用来描述模型的 33、面向对象的基本概念类、对象、封装、继承等定义是什么?...继承性:如果一个类 A 继承自另一个类 B,就把这个 A 称为”B 的子类”,而把 B 称为”A 的 父类”。...面向对象=对象+类+继承+通信 1、画出UML中依赖关系的图形符号 —————-> 2、在UML 2.0中定义了四种交互图,其中强调对象调用顺序的是程序图。
Java中实现高内聚低耦合的常用方式: 少使用类的继承,多用接口隐藏实现的细节。 模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。 遵循一个定义只在一个地方出现。...它是一种极限编程(XP)实践,表示程序员不应为目前还不需要的功能编写代码。YAGNI很像KISS原则,因为它也是致力于构建简单的方案。...继承的缺点主要有以下几点: 继承复用破坏数据封装性,将基类的实现细节全部暴露给了派生类,基类的内部细节常常对派生类是透明的,白箱复用。虽然简单,但不安全,不能在程序的运行过程中随便改变。...在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。...使用继承时必须满足Is-A的关系是才能使用继承,而组合却是一种Has-A的关系。导致错误的使用继承而不是使用组合的一个重要原因可能就是错误的把Has-A当成了Is-A。
错误原因简单说就是代码不符合 Python 的语法规则。Python 对语法的要求特别严格,比如括号要成对出现、语句结束不需要分号但特定地方必须有冒号、字符串的引号要配对等等。...解决办法仔细检查报错信息里提示的行数,看看附近有没有拼写错误、遗漏的符号或者不正确的标点。建议写代码时边写边运行,不要等写了一大堆再运行,那样找错会很麻烦。...简单说,就是你想操作的属性或方法在这个对象上根本不存在。解决办法先搞清楚你操作的对象是什么类型,这个类型有哪些属性和方法。...math import my_function # math模块里没有my_function错误原因出现这个错误主要有几种情况:模块名拼写错误、模块没有安装、导入的内容在模块里不存在、模块路径不对(...,当一个抽象基类定义了一个抽象方法(用@abstractmethod装饰的方法),但继承它的子类没有实现这个方法时,就会出现这个错误。
但这背后的原因究竟是什么?仅仅是因为组合更加灵活吗?答案远不止于此。这种设计偏好的背后,实际上隐藏着深刻的数学原理,它关乎系统结构的稳定性、可预测性和长期可维护性。...层次结构僵化:继承树在编译时就已经确定,是静态的。当现实需求出现"既是A又是B"的概念时(比如"会飞的鸭"和"不会飞的鸭"),单继承体系难以优雅建模,而多重继承又会引入菱形问题等复杂性。...逻辑蕴含的本质继承的核心可由公式 A > B ⇒ P(B) → P(A) 精确刻画:注:A 类继承的标准符号,但这里为了数学上的明确性,我们使用 A > B 来直观表达"派生类比基类多...现在让我们转向组合范式,看看A = B + C的代数构造如何提供更优的解决方案。组合范式:代数构造与模块化构建与继承的断言式逻辑截然不同,组合的核心由公式 A = B + C 定义。...)松耦合(黑盒复用)系统形态树状、层级化、脆弱网状、模块化、健壮推理模式全局推理、心智负担重局部推理、清晰简单演化能力困难、风险高灵活、风险低从 A > B 的偏序断言到 A = B + C 的代数构造
,用于解决maven的单继承问题。...,声明插件,管理插件配置,子项目直接继承,无需重复编写配置规则。声明变量,用于对变量的管理,如版本号,通过${}取值。...JVM加载类JVM会根据顺序加载class文件,如果全限定名重复,后面的class将会被忽略。...如果存在同类名的class可以考虑:移除重复的class写类加载器来加载特定的class改变classpath里的顺序springboot生成jar结构目录阿里的一些开发规范【强制】禁止在子项目的 pom...某些二次封装的包与以前包全限定类名一致并且接口内容不一致产生错误如对一些常用依赖进行了二次封装,但是接口方法有差别,导致编译时出现错误。
你还可以避免由于不正确使用这两种方法而导致的错误。 8、 立即调用函数表达式和模块 立即调用的函数表达式是定义后立即运行的函数。它们主要用于避免污染全局作用域。...通过理解IIFEs和模块,你在开发应用程序中,可以遇到更少的由于全局作用域处理不当而导致的错误。然而,使用模块,你可以做很多事情。...根据Tania的说法,“JavaScript中的类实际上并不提供额外的功能,通常被描述为在原型和继承之上提供语法糖,因为它们提供了更干净、更优雅的语法。...其他编程语言都使用类,所以JavaScript中的类语法使得开发人员在不同语言之间的转换更加简单。” 工厂函数是一个不是类或构造函数但是返回对象的函数。...简单地说,原型就是JavaScript对象从其继承方法和属性的对象。 通过更好地理解原型,你可以构建高效、快速的应用程序。
在 Windows 中,虽然每个 DLL 有自己独立的符号表和堆管理,但如果多个模块间存在互相访问,这种重复可能会导致问题。...例如,可能会出现类似“error LNK2001: 无法解析的外部符号 'std::basic_ostream::write'”的错误。...当 gRPC 作为静态库链接到多个动态库时,每个动态库都会执行一次这些构造函数,导致全局变量和函数符号的重复初始化。...4.5 使用动态库如果可能,优先使用 gRPC 的动态库。这样可以避免静态库链接到多个动态库时可能出现的问题。4.6 脚本化构建维护一个 build.bat 或类似的脚本,记录完整的构建流程。...这有助于确保构建的一致性和可重复性。5.
但是这种简单的模块划分方式存在着一些问题: 应用上层的热修复方案需要so库能够支持被动态加载,这样出现问题的so库才能够在应用运行的时候先被替换为修复问题的库文件然后才被加载。...so库之中定义的函数和数据结构; 当so库的调用结束,调用dlclose()函数关闭卸载so库; 如果在打开关闭so库,或者获取so库里操作对象的指针出现错误的时候,可以调用dlerror()函数获取具体的错误原因...JNI层so库操作基类对象,而在功能实现的so库则继承这些基类定义实现具体操作。...4. so库之间动态加载需要解决的问题 不同Native层模块的构建的STL版本不一致,会导致参数错误 由于动态加载的调用方和被调用方是分别构建成具体的so库或其他可执行文件,所以其中使用的来自C++...dlopen直接加载存放在SD卡的so库,会出现权限禁止的问题 在尝试动态加载存放在SD卡的so库的时候,出现了原因是“Permission denied”的UnsatisfiedLinkError。
相反,在创建新类时首先要考虑“组合”,因为它更简单灵活,而且设计更加清晰。等我们有一些编程经验后,一旦需要用到继承,就会明显意识到这一点。 继承 “继承”给面向对象编程带来极大的便利。...以某种方式创建集合,以确认保存元素的具体类型,减少集合元素“向下转型”的开销和可能出现的错误难道不好吗?这种解决方案就是:参数化类型机制(Parameterized Type Mechanism)。...为了资源的重复利用,当对象不再被使用时,我们应该及时释放资源,清理内存。 在简单的编程场景下,对象的清理并不是问题。我们创建对象,按需使用,最后销毁它。...结合单继承和仅可在堆中创建对象的机制,Java 的编码过程比用 C++ 要简单得多。我们所要做的决定和要克服的障碍也会少很多! 异常处理 自编程语言被发明以来,程序的错误处理一直都是个难题。...这让我们的编码更简单:不用再反复检查错误了。另外,异常不像方法返回的错误值和方法设置用来表示发生错误的标志位那样可以被忽略。异常的发生是不会被忽略的,它终究会在某一时刻被处理。
大家好,又见面了,我是你们的朋友全栈君。 4.Java编译原理 1.javac是什么?...对Token流进行语法分析,检查关键词的组合是否符合语法,最后得到抽象的语法树(语法树是吧语言的主要此法用一个结构化的形式组合在一起) 进行语法分析,把难懂的,复杂的语法转化成更加简单的的语法...,还需要给类添加默认的构造器,检查变量使用前是否已经初始化…等操作(检查是否有语法错误在这一步?)...输入到符号表中:第一步将所有类中出现的符号输入到自身的符号表,并将类符号、类的参数类型符号(泛型参数类型)、超类符号,继承类型符号和继承的接口类型符号都存储到一个未处理列表中。...第二步将这个未处理列表中的所有类都解析到各自的符号列表中。
取消某个符号的定义,进行重定义; 6) define独特功能,比如可以用来防止文件重复引用。...2) 多重继承的优点很明显,就是对象可以调用多个基类中的接口; 3) 如果派生类所继承的多个基类有相同的基类,而派生类对象需要调用这个祖先类的接口方法,就会容易出现二义性 4) 加上全局符确定调用哪一份拷贝...1) C++中的异常情况: 语法错误(编译错误):比如变量未定义、括号不匹配、关键字拼写错误等等编译器在编译时能发现的错误,这类错误可以及时被编译器发现,而且可以及时知道出错的位置及原因,方便改正。...3、 如果在类的析构函数中调用delete this,会发生什么? 会导致堆栈溢出。原因很简单,delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”。...操作; 5、设计复制构造函数,在进行复制函数中对count+1操作; 6、在析构函数中对count进行-1; 155、怎么快速定位错误出现的地方 1、如果是简单的错误,可以直接双击错误列表里的错误项或者生成输出的错误信息中带行号的地方就可以让编辑窗口定位到错误的位置上
面向对象是一种思想,世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP),Java是一个支持并发、基于类和面向对象的计算机编程语言,面向对象软件开发的优点: 代码开发模块化,更易维护和修改; 代码复用性强...类封装的实现依赖类的修饰符(public、protected和private等) 继承:对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。...这里指的继承包含:类的继承和接口的实现。 多态:多态是在继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类对象。...Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。...同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。
如果是,就重复上述处理过程 注意: 宏参数和#define定义中可以出现其他#define定义的符号。...宏可能会带来运算符优先级的问题,导致过程容易出现错误 宏有时候可以做函数做不到的事情,比如:宏的参数可以出现类型,但是函数做不到 对比 建议: 如果逻辑比较简单,可以使用宏来实现 如果计算逻辑比较负责...嵌套文件的包含 如果出现这样的场景 comm.h和comm.c是公共模块 test1.h和test1.c使用了公共模块 test2.h和test2.c使用了公共模块 test.h和test.c使用了...3.3 调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正,重新测试 发现程序错误:程序员自己、测试人员、用户 3.4...那么作为语言,英语有诸多的语法,那么编程语言同样有一定的语法。毕竟写出来的代码是需要让机器看懂的。 编程思维 那么思维是什么呢,简单说就是做一件事情,脑海里要能够搭建起一个简单的框架,然后再填填补补。
java面向对象 面向对象都有哪些特性,以及你对这些特性的理解? 继承:继承是从已有类得到的类的信息创建新类的过程。...写你最常见的5个 RuntimeException java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。...java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。...java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。...,成对出现,键对象不可以重复,值对象可以重复; Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序 HashMap 和 HashTable 有什么区别