Code 几条原则

1、OCP(Open-Close Principle)开闭原则

Software entities should be open for extension,but closed for modification,(在设计一个模块的时候,应当使这个模块可以在不被修改的前提下扩展)。

对扩展开放open,对修改关闭close。

如何实现?1,抽象化是关键,2对可变性的封装原则(Principle of Encapsulation of Variation EVP)。3.对可能的拓展预留接口

备注:

1) 对于抽象化, 我的理解是, 接口是相对稳定的, 实现是根据需求多变的。对于大多数可能预料的变化点, 我们可以抽取出共性或者常态点, 进行接口的封装, 而选择不同的实现类嵌入模块, 从而达到可扩展的作用。

2) 对于某个业务点, 可能以后有多种介入处理的情况, 那么这时候可以将业务抽象成事件(event)接口和监听器(listener)接口, 不同的处理需求生成不同的listener, 接入模块的listener收集器, 从而得到业务点的介入机会。最后达到功能的扩展。

典型容易理解的例子,工厂模式。当需要新增加一个类的时候,直接继承product接口就可以了 , 由工厂类来组装产生需要的product, 而不用大范围修改原有代码。OCP~

2、Liskov Subsitution Principle(LSP)里氏代换原则

就是子类可以代替父类出现的任何地方,在抽象的时候,重要的要理解的一个地方两个类之间是什么关系,是“has-A”?还是“Is-a”的关系。在 “has-a”的关系中,两个类存在的是依赖的关系(在类A里面存在类B的的变量);在“Is-a”的关系中,可以提取这两个类的“共同代码”放在抽象类 C中,然后A,B继承与C,这也是一种重构。

3、Dependency Inversion Principle(DIP)依赖倒转原则

就是在我们编程的时候方法的参数类型,变量,对于其他具体类的依赖,我们尽量的使用抽象类。
就是说尽量依赖于抽象,而不是依赖于实现。

在书中两种表述:

(1)Abstraction should not depend on details.details should depend on abstraction。(抽象不应当依赖于细节,细节应当依赖于抽象)。

Abstraction就像是建筑物的基础,而其实现类就是在基础上面一层一层的往上面走。你拆掉最上面 那层,和拿走最下面的基础,有什么不同了,这就是差异了。所以Abstraction是要相当的稳定,是维护的重点。也正是因为稳定,所以我们尽量的依赖 于Abstraction,既是稳定系统,也是灵活系统。

(2)Program to an Interface,not an implementation(要针对接口编程,不要针对实现编程)

应当使用java接口和抽象java类进行变量的类型声明,参数的类型声明,方法返回值的类型和数据类型的转换。

备注:
依赖倒转原则的作用在于多模块或者类间有统一的”知识”, 都知道有这个接口, 都知道这个接口是这样用,会返回什么数据。

至于最初的实现类是什么, 只有提供该接口功能的实现类自己关心, 其他模块或者类只管用就行了。即使以后需求更改, 实现会换成别的一个, 其他模块和类也无需修改代码。

例如A模块提供了一个接口是: List getProducts()

而B和C会使用该模块, 他们只知道这个方法就会返回List , 他们知道List和Product代表什么.

但他们不会管你的接口内部是使用List list = new ArrayList() , 还是List lis = new LinkedList()

或者具体的Product是什么(可能是衣服,鞋子等)

4、Interface Segregation Principle(ISP)接口隔离原则

限制一个实体对另一个实体通信时候的宽度。

就是一个类对另外一个类依赖的时候,应当是建立在最小的接口上面。对于接口隔离原则来说,有两种接口,一种是真正意义上面的“java 接口”Interface;另外一种是指一个类的方法的集合。对于这来两种有,两个接口隔离的原则,对于一个类里面的方法的集合的接口隔离,我们称作是 “角色隔离原则”;另外一种叫做“定制服务”。

定制服务,就是一个类,我给你这个客户端一些方法,我放在一个java接口(Interface)里面。给另外一个客户端另外一些方法,放在另外一个接口(Interface)。

角色隔离原则,是指客户端要多个不同的类的方法,我们就搞几个不同类别的接口(Interface),在书中,这么比喻的,就相当于电影剧本里面的人物,我们找人来演,这个人就是具体的类。这就叫做角色隔离原则。

5、Composition/Aggregation Reuse Principle(CARP)组合/聚合复用原则

就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的。

其实这里最终要的地方就是区分“has-a”和“is-a”的区别。相对于合成和聚合,继承的缺点在于:父类的方法全部暴露给子类。父类如果发生变化,子类也得发生变化。聚合的复用的时候就对另外的类依赖的比较的少。

6、Least Knowledge Principle(LKP)最少知识原则,又称为“Law of Demeter”迪米特原则

和ISP接口隔离原则一样,限制类与类之间的通信。ISP限制的是宽度,而LoD迪米特原则限制的是通信的广度和深度。

LoD在广度上面,尽量减少远距离类的关联,而使用与自己有关的类,并且也与远距离类有关的类。

可是这种做法有一点麻烦。多个远距离类产生关联的时候,不怎么容易处理,所以增加一个远距离类的抽象类。所有的远距离类都是通过抽象类的形式来访问。

在深度上面,控制权限是最重要的,对于类,一个是default 和public,尽量最小权限;对于成员,private,default,protected,public。往上面走,权限越小,依赖的耦合就越小。

有几种描述:

(a)Only talk to your immediate friends.
(b)Don’t talk to strangers.

设计模式“facade”,”调停者模式”。在这里是IoD的典型表现。

备注:

当一个系统比较大的时候, 如果所有的模块都自己去寻找与自己相关的类的时候, 那么引用关系就会变得极度复杂, 耦合度高。

这个时候最好就设定一个为各个模块所熟悉的对象, 例如Context容器。

另外,各个模块可以应用facade模式, 提供一个简单的对外接口, 并将其嵌入Context容器。

这样, 模块间通过熟人Context来获取其他模块的Facade接口, 即符合依赖倒转原则, 接口隔离原则和迪米特原则。

### 解决方案概述 在软件或系统上下文中,错误代码通常对应特定的功能模块或操作失败的原因。对于提到的错误代码2,在没有具体描述的情况下,可以从以下几个方面分析并提供通用解决方案: #### 数据连接问题 如果错误涉及数据模型无法加载的情况,可能与数据源配置有关。例如,Power BI 连接 Azure Data Lake Gen2 的场景中提及的数据模型获取失败[^1],可能是由于权限不足、网络延迟或者数据湖服务未正确初始化等原因引起。 #### 内存计算优化中的潜在问题 内存计算优化过程中可能出现多种异常情况。在线上优化(Online Optimization)[^2] 中,增量更新可能导致状态不一致;而在离线优化(Offline Optimization)中,则可能存在资源分配不当的问题。这些都可能映射到某种形式的错误编码机制下被标记为“Error Code 2”。 #### 微服务体系下的事件驱动架构故障排查 微服务环境中采用事件驱动架构(Event-Driven Architecture),如通过RabbitMQ实现发布/订阅模式(Pub/Sub Messaging)[^3] ,也可能触发类似的编号型错误提示。“Code 2”在此情境里或许代表消息传递超时或者是消费者未能及时处理生产者发送过来的消息等问题之一。 以下是针对上述不同层面给出的具体解决建议及其技术细节说明: --- ### 技术实施指南 #### 权限管理调整 (适用于 PowerBI 场景) 确保账户具有足够的访问级别来读取目标存储位置内的文件夹结构以及具体内容物。可以通过Azure门户界面授予适当的角色定义给执行主体身份标识符(SID), 如贡献者Contributor 或更高级别的管理员Administrator角色设置. ```bash az role assignment create --assignee <service-principal-id> --role "Storage Blob Data Contributor" ``` 此命令用于赋予指定的服务主体对Blob容器的操作许可权能. #### 调整性能参数以改善实时响应效率 当面临规模并发请求时, 可考虑引入缓存策略减少重复查询开销; 同时也要注意监控服务器负载水平防止过载崩溃现象发生. 对于OLTP类应用而言, 增加索引覆盖度有助于加快检索速度从而降低延时风险. 另外还可以利用A/B测试方法对比各种算法组合效果找出最优解路径: ```python def evaluate_performance(algorithm_a, algorithm_b): results = [] for algo in [algorithm_a, algorithm_b]: start_time = time.time() result = run_algorithm(algo) elapsed_time = time.time() - start_time results.append({ 'name': str(algo), 'time_taken': elapsed_time, 'output': result }) return min(results, key=lambda x:x['time_taken']) ``` 上面展示了一个简单的函数用来比较两个候选算法的表现差异, 并选取表现更好的那个作为最终采纳版本. #### 加强异步通信可靠性保障措施 为了提高基于消息队列构建的应用系统的稳定性和可用性程度, 应该采取诸如重试机制Retry Mechanism 和死信交换Dead Letter Exchange(DLX)这样的防护手段应对突发状况的发生概率最化控制损失范围最小化原则贯彻始终贯穿整个设计思路当中去落实到位才行得通啊亲~ 比如下面这段Java代码片段就展示了如何优雅地捕获AMQP协议层面上发生的各类意外情形并且妥善处置它们不至于影响整体业务流程继续正常运转下去呢? ```java try { channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes()); } catch (IOException e) { logger.error("Failed to publish message", e); try { Thread.sleep(RETRY_DELAY_MS); // Wait before retrying channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes()); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Message publishing interrupted", ie); } } ``` 这里实现了基本的一次性尝试加上一次有限间隔后的再次努力机会逻辑链条闭环形成完整的事务边界划分清晰明了易于维护扩展性强等特点兼具一身哦小伙伴们快来学习借鉴吧! --- ### 结论总结 综上所述,“error code 2”的确切含义取决于实际应用场景和技术栈选型的不同而有所变化。以上分别从数据接入授权校验、运算效能调优以及分布式协作框架健壮性增强个维度阐述了解决策略供参考选用。希望这些建议能够帮助您快速定位并有效解决问题! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值