编码小技能:编码原则、面向对象、网络通讯五元组、LSP、一款不错的SpringCloud 脚手架项目

简介: 避免代码和功能的重复,DRY(Don’t repeat yourself)。

前言

先说说对我影响比较深的编码原则:

  1. 避免代码和功能的重复,DRY(Don’t repeat yourself)。
  2. 开放封闭的设计理论(Open Closed Design Principle):类、方法以及功能应该对扩展开放(新的功能),而对更改封闭。
  3. 单一责任原理(Single Responsibility Principle (SRP)):类似于接口分离理论(Interface Segregation principle (ISP),一个类只完成单一的功能,这样可减少测试。
  4. 代理(Delegation principle): 将任务代理给相应的类去做,例如equals()hashCode()方法。
  5. 从设计保证质量:程序员心中要当作没有测试环节(uat测试),程序质量不要依赖后续的测试,即使测试通过,并不代表版本正确。
  6. 关联和独立性(关于程序的维护):代码中经常动的和不经常动的要分离,业务经常变化和不变化的也要分离。
注:只测试变动的代码,并不是完整的测试,尤其是耦合度高的代码更是如此。
  1. 读代码也是测试的一种方法,大脑带着数据进行测试。
  2. 关于代码的特殊处理(减少与环境的关联性):针对临时代码,我们需要详细注释,尤其是uat测试的临时代码,应写在组件里面,以便uat写死的数据可以方便的在上生产时去掉;当然组件加些自我检测的代码更好。不要因为环境的问题而导致程序不一致,要将应用处理的逻辑分离出来。
  3. 代码比对:Beyond Compare 3比对工具用于发现跟自己的cr无关的代码,让我们测试过的代码上生产。

I 面向对象

object是指一个具体的事物实例

Object oriented:指面向客观事物之间的关系(对象与对象)

面向对象的定义:根据用户需求抽象出业务对象,然后再根据需求进行合理划分;形成相对独立的业务功能,之后再设计业务逻辑。利用面向对象的特点(封装、抽象、继承、多态)的编程思想实现业务需求,最后通过每个业务之间功能的关系进行整合,从而满足客户的要求。

在分析项目业务关系的时候,应用一些UML(Unified Modeling Language)图,例如常用的用例图(use case diagram),类图(class diagram),时序图(sequence diagram)等等,会有很大的帮助,这样能尽快找出业务逻辑主要面对的对象,然后对每个对象进行行为划分,最后再实现对象之间的集成和通信。

1.1 面向对象分析设计(object oriented analysis design)

  1. 方法:要求设计中要映射现实世界中指定的问题域中的对象和实体。
  2. 优点:能够构建于现实世界相对应的问题模型。并且能够保持它们的结构、关系和行为的一种编程思想。

1.2 面向对象中的概念

  1. 类型(类):名词
  2. 引用(变量):用来指向具体东西的代词
  3. 对象:指具体概念的个体实例
  4. 行为:方法、动作。
  5. 多态:行为多态,通过相同的动作完成的,但是完成结果不同;引用多态,同一个代词指代对象不同。
比instanceof更精确地判断对象类型的方法是采用getClass方法进行比较。
  1. 封装:任何对象实例都是尽可能的保护其内部的具体实现,减少暴露。他的实现细节不需要其他对象关注。比如,汽车的发动机。

1.3 敏捷开发工程

  1. 定义用例:需求分析可能包括人们如何使用应用的情节或场景
  2. 定义领域模型:面向对象的分析关注领域的概念,属性和关联来形成OOA结果领域模型(domain model),在领域模型中展示重要的领域对象。
  3. 分配对象职责,并绘制交互图:ood关注软件对象的定义(它们的职责和协作)。
注:顺序图(sequence diagram)是描述协作的常见表达方式,它展示了软件对象之间的 消息流,和由消息引起的方法调用
  1. 定义设计类:使用设计类来表示有效类定义的静态视图,重点描述类的属性和方法。

1.4 对象实例化的过程

1)判断类是否被加载,如果未加载,则递归加载该类以及该类的父类。

2)为静态属性赋值

3)根据构造器中的参数类型,调用该类相应的构造器来为属性赋值。

4)将创建好的对象的地址值返回给变量。

构造器用来创建对象,不能被继承。

1.5 静态访问和动态访问

  1. 静态访问:提供变量的类型,根据编译时的类型来访问
  2. 动态访问:根据运行时的类型访问
注:用private修饰的方法和属性,才可以动态访问。

II 网络通讯五元组

https://blog.csdn.net/z929118967/article/details/74453141

III Language Server Protocol(语言服务器协议,LSP)

The Language Server Protocol (LSP) defines the protocol used between an editor or IDE and a language server that provides language features like auto complete, go to definition, find all references etc. The goal of the Language Server Index Format (LSIF, pronounced like "else if") is to support rich code navigation in development tools or a Web UI without needing a local copy of the source code.

https://microsoft.github.io/language-server-protocol/

sourcekit-lsp :https://github.com/apple/sourcekit-lsp

SourceKit-LSP is an implementation of the Language Server Protocol (LSP) for Swift and C-based languages. It provides features like code-completion and jump-to-definition to editors that support LSP. SourceKit-LSP is built on top of sourcekitd and clangd for high-fidelity language support, and provides a powerful source code index as well as cross-language support. SourceKit-LSP supports projects that use the Swift Package Manager.

Language Server Protocol 为支持的语言提供了一套通用的功能集,包括:

  1. 语法高亮(Syntax Highlighting)
  2. 自动格式化(Automatic Formatting)
  3. 自动补全(Autocomplete)
  4. 语法(Syntax)
  5. 工具提示(Tooltips)
  6. 内联诊断(Inline Diagnostics)
  7. 跳转到定义(Jump to Definition)
  8. 项目内查找引用(Find References in Project)
  9. 高级文本和符号搜索(Advanced Text and Symbol Search)

3.1 Language Server Protocol 的工作原理

类似于一个精简版的 HTTP:

  1. 每个消息都由报头部分和内容部分组成。
  2. 报头部分包含一个必填的 Content-Length 字段,用于说明内容部分的大小(以字节为单位),以及一个可选的 Content-Type 字段(默认值为 application/vscode-jsonrpc; charset=utf-8)。
  3. 内容部分使用 JSON-RPC 描述请求、响应和通知的结构。

每当工具中发生了什么事情,比如用户需要跳转到符号的定义,工具就会向 server 发送一个请求。server 接收到该请求,然后返回适当的响应。

发生请求给Swift language server

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "textDocument/definition",
  "params": {
    "textDocument": {
      "uri": "file:///Example.swift"
    },
    "position": {
      "line": 11,
      "character": 13
    }
  }
}

响应

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "uri": "file:///Example.swift",
    "range": {
      "start": {
        "line": 10,
        "character": 6
      },
      "end": {
        "line": 10,
        "character": 12
      }
    }
  }
}

编辑器除了Swift 代码相关以外,可以对 Swift 编程语言一无所知。编辑器需要做的就是与 language server 交互并更新 UI。

3.2 LLVM 的 Language Server Protocol 实现

LLVM 是一系列 分模块和可重用的编译工具链,他提供了一种代码编写良好的中间表示(IR),可以作为多种语言的后端,还可以提供与编程无关的优化和针对多种CPU的代码生成功能。

在 5.0.0 版本中,Clang 添加了一个名为 Clangd 的新工具,它是 LLVM 对 Language Server Protocol 的实现。支持 Language Server Protocol 可以让苹果生态圈以外的人更容易地使用他们熟悉工具去使用 Swift。

LLVM 所支持的语言使用编译器前端(compiler frontend) 生成 IR,再使用 编译器后端(compiler backend) 将 IR 生成所支持平台的机器码。

当编译器需要支持多种源代码和目标架构时,基于LLVM的架构,设计一门新的语言只需要去实现一个新的前端就行了,支持新的后端架构也只需要实现一个新的后端就行了。其它部分完成可以复用,就不用再重新设计一次了。

LLVM架构的主要组成部分:https://blog.csdn.net/z929118967/article/details/75201075

Swift compiler architecture:


ast: abstract syntax tree

传统的编译器的架构:

IV 一款不错的SpringCloud 脚手架项目


项目概述:

  • springboot+springcloud
  • 注册中心:nacos
  • 网关:gateway
  • RPC:feign

可插拔功能组件:

  • 流控熔断降级:sentinel
  • 全链路跟踪:sleth+zipkin
    分布式事务:seata
  • 封装功能模块:全局异常处理、日志输出打印持久化、多数据源、鉴权授权模块、zk(分布式锁和订阅者模式)
  • maven:实现多环境打包、直推镜像到docker私服。

转载:https://mp.weixin.qq.com/s/fQTkMY2hK2AuOI3gE0TggQ

原文:springCloud 脚手架项目: https://mp.weixin.qq.com/s/tnXEmI2cstUQ4Ft-611W4w

关注公号:iOS逆向,回复【SpringCloud】。

目录
相关文章
|
1月前
|
安全 虚拟化
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力。通过具体案例,展示了方案的制定和实施过程,强调了目标明确、技术先进、计划周密、风险可控和预算合理的重要性。
41 5
|
1月前
|
机器学习/深度学习 移动开发 JavaScript
介绍一下HTML5的新技能:神经网络
介绍一下HTML5的新技能:神经网络
36 5
|
3月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
110 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
17天前
|
机器学习/深度学习 Serverless 索引
分类网络中one-hot编码的作用
在分类任务中,使用神经网络时,通常需要将类别标签转换为一种合适的输入格式。这时候,one-hot编码(one-hot encoding)是一种常见且有效的方法。one-hot编码将类别标签表示为向量形式,其中只有一个元素为1,其他元素为0。
22 2
|
2月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
172 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
20天前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
27 0
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
140 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
72 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
122 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
105 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台