项目间移植代码时的一个感悟——解除依赖链!

跨平台代码编写注意事项 跨平台开发注意事项 阅读详情

之前一直有一个疑惑,就是在代码中经常会遇到这样的情况。为了做某件事情或者实现某个功能,需要组多的前置信息或者参数,那么这些参数是传入进去还是由下层的类自己去获取? 也就是经常出现,A->B->C->(D&E)->F.... 这样的依赖链。像这样情况,很不利于诸如B,C,D,E这些类的重用(通用)。在采用“自顶向下设计”的方式中,比较容易出现这样的情况。(特别声明,这里不是说不要采用“自顶向下设计”的方式)。今天在从一个项目里移植代码到另一个项目里的时候,又确切的遇到这样的问题了。想了想,感觉这样的代码还是有一些问题的,但是又道不出具体的理由。

例如:

如果我们想将一条曲线添加到一个部件或图形上,而曲线的点数据存储在一个文件中。

那么采用自顶而下的设计方法,我们很容易写出类似下面的代码。

class Client

{

  void addCurve()

  {

CurveDrawer drawer(getFileName());

drawer.draw();
  }

  std::string getFileName();
};


而槽糕的是,某些情况下从文件里读出来的数据点需要再做一个转换才能直接被使用,于是这里就有两个选择,

1)在类 CurveDrawer  中调用 CoordConvertor 转换后再传给 CurveItem . 

2)直接将从 文件里读出来的数据点传给 CurveItem ,由CurveItem 自己再调用 CoordConvertor 转换后再使用。

在自顶向下的设计中,大多数情况下会不自不觉的采用2)。

而一旦出现这种情况,CurveDrawer  和 CurveItem 就很难被重用(通用)。如果说CurveDrawer  会比较少的需要被重用,

那 CurveItem 需要被重用的需要和理由应该是非常充分的。  但是因为它还依赖于 CoordConvertor,所以其实其仍然很难被重用。

打住!你肯定会说我想多了,再想多就有过度设计的嫌疑了。是的,我承认,我也认为似乎有一点这样的嫌疑。(是不是啊?)

但是,我又真心觉得让 CurveItem 能够被重用其实一点也不过分。

我只是觉得目前这样的设计确实不够。因为目前的 CurveDrawer 类和 CurveItem 不能够经得住考验,一旦我的数据不是从文件而来,而是从数据库或者别的模块传入?那该怎么办?更有可能,在有些情况下,客户端拿到的数据点可能不需要经过转换即被直接使用(这时候CurveItem 得添加if判断了,讨厌!)。

那么,问题出在哪里?

1)是应该这样设计,在变化来临的时候再去重构?还是在这样的场合可以提前预知,适当的预构?

2)或者说目前这样的设计其实已经有严重的代码臭味了?因为其每个类都不独立,有很强的相互依赖,从单一职责原则来讲,也有很大问题,

例如,CurveDrawer  至少有“读取文件”和“绘制曲线”两个职责, CurveItem 有“转换坐标点” 和 “渲染点”两个职责。

3)从依赖注入的角度来说,像上述情况应该由client类读取文件,再根据需要转换坐标,然后直接将数据点塞给 CurveDrawer  类,也就是说,

CurveDrawer  (或者至少是CurveItem  )应该由现在的接收文件名称变为接收数据点序列——这样CurveDrawer  或CurveItem类就会变得比较通用了 。

4)如果这样,那么客户端代码就会显得庞大臃肿些,是不是又违反了“尽量让客户代码易用,减轻客户代码工作”的原则?


一点体会,记录下来,继续悟!


小白如何优雅的“移植”github的代码? 这里我试过的方法有:添加sys路径、设置根目录,修改pycharm设置,但是都不行,只有丢到一起管用,这没办法了,黑猫白猫能抓住老鼠的就是好猫,接着下一步吧!终于不报cuda的错了,说明cuda和torch适配了,接下来我们集中解决下上面这个问题。果不其然,这个是人家自己写的代码不再是库了,那我们就吧对应的引入都跑一下吧,当然肯定会有报错,无需慌张,且看十八般变化,万变不离其宗。这太搞了,居然还是调用不了,我记得之前遇到这种问题都是直接放弃或者直接把东西全部挪到一起,简单粗暴,现在是时候解决问题了。 阅读详情

相关推荐

常规开源库移植流程

0. 说明 ​ 现在网上很多开源代码,抛开开源协议不说,我们要把它拿来用,通常可以按以下流程来移植。 1. 编译 ​ 成熟的开源代码大部分可以通过configure来配置然后编译,通常有以下几种方式可以编译移植,常见的是第2、3两种方法。 ​ 没有用configure的,就具体看看源码中的readme,一般都会有介绍。 1.1 直接makefile修改编译器和打包路径 ​ 比如在makefile中增加以下字段 CC=arm-oe-linux-gnueabi-gcc PREFIX=$(PWD)/build

BiigPanda的博客 2603

STM32工程添加模块、代码移植操作步骤

模块化代码有助于代码的简洁性和可移植性

qq_51608866的博客 9099

环境配置 |Jupyter lab/Jupyter Notebook 安装与设置

ipynb使用Jupyterlab/Jupyter Notebook 来编写程序时的文件,在使用时,可以现转换为标准的.py的python文件。

weixin_44649780的博客 5771

代码移植注意事项

1、包以及引包的路径名。2、bo层的数据库表对应3、controller对应路径名4、spring等配置文件5、数据源6、jsp样式来自为知笔记(Wiz) 转载于:https://www.cnblogs.com/anobugworld/p/7112302.html...

weixin_30508241的博客 1184

Field _II 仿真 学习笔记

参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >>

qq_34018578的博客 1万+

《寻秦OL》.ani动画逆向解析:二进制结构与Unity重实现

动画文件格式是游戏资源逆向的核心入口,其本质是一组按特定规则组织的二进制数据流。理解魔数识别、字节序、字段对齐与差分编码等底层原理,是解析非标准格式的关键前提。技术价值在于绕过黑盒协议,直接从静态客户端提取可验证的原始语义;典型应用场景包括老游戏复刻、美术资产抢救、引擎跨平台迁移及教学级逆向训练。本文以《寻秦OL》的`.ani`文件为实例,深入剖析其C风格结构布局、GB2312中文命名、16位定点数旋转表示及帧主序差分存储机制,并基于C#在Unity中完成从字节流到AnimationClip的端到端重建,覆

weixin_30368981的博客 640

跨平台的 C++ 代码移植要点

-------------------------------------------------------------------------------- 标题: 跨平台的 C++ 代码移植要点 作者: 叶飞虎 日期: 2010.09.06 ------------------------------------------------------------------------

Kyee编程之道 2114

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 505

AndroidStudio如何进行代码移植?

在安卓应用开发过程中,往往需要借鉴他人代码,当拿到源文件后,用自己的安卓编译器不一定能成功编译运行,需要进行代码的移植修改,才能顺利使用他人的安卓应用源代码。

【cacrle】的博客 2493

概率质量函数(PMF)、概率密度函数(PDF)、累积分布函数(CDF)

1.概率分布函数(Probability Distribution Functions) 笔记来源:Probability Distribution Functions (PMF, PDF, CDF) 1.1 离散型:PMF和CDF 1.2 连续型:PDF和CDF 累积分布函数的导数 === 概率密度函数的函数值 dF(x)dx=f(x) \frac{dF(x)}{dx}=f(x) dxdF(x)​=f(x) 概率密度函数与 xxx 轴围成的面积 === 累积分布函数的函数值 ∫−∞xf(x)d

一个搬运知识的笨小孩 3万+

iOS远程真机之ios-minicap安装使用完全指南

minicap 是开源项目 STF 中的高速截图工具。STF利用此工具不断的传输图片信息并在web端绘制实现 以前只有Android版本,最近有新的ios版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢sorccu 在issue里面给我的指点) 首先上地址:https://github.com/openstf/ios-minicap 你可以git clone或者直接下载zip包。

甫式人生 1万+

伺服电机控制

逆变电路、SPWM/SVPWM、FOC、自动控制原理

我是谁我在哪我在学什么 1万+

ABAP CDS HAVING 全解析:聚合之后的精准过滤、最佳实践与可运行示例

摘要: 本文针对具备ABAP与CDS基础的开发者,详解HAVING在ABAP CDS中的核心用法。HAVING专用于过滤GROUP BY后的聚合结果(如SUM、COUNT),与WHERE的分工明确:前者处理聚合值,后者过滤原始记录。通过销售额阈值、质量分析、财务对账三类典型场景,结合性能优化建议(如优先使用WHERE索引过滤),说明实际应用。文中提供经典CDS View与View Entity两种实现代码,并附Open SQL消费示例,帮助开发者快速落地。常见误区(如聚合条件误写至WHERE)与规避方法亦被

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 221

stm32f103rct6的代码移植到stm32f103c8t6

目前市面上见的较多的STM32单片机一般都是开发板,由于这些开发板又很丰富的例程,因此使用起来非常方便,但是我们实际在应用的时候,有时候可能用不了那么多的管脚,因此会造成管脚资源的浪费,而且管脚多的成本也会很高。同时这些STM32单片机的基础的库基本都是一样的,因此理论上来说,应该是可以进行移植的,博主今天来分享一下代码移植的方法。本次采用stm32f103rct6的代码移植到st...

AlwaysSun的博客 4万+

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IAR写的C++代码工程移植到keil的笔记

IAR移植STM32工程到keil

电子信息小白菜 2200

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

移植某开源代码到嵌入式板子上的一点经验

移植某开源代码到嵌入式板子上的一点经验

kv110的专栏 599

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

stm32f103rct6的代码移植到stm32f103c8t6教程

目前市面上见的较多的STM32单片机一般都是开发板,由于这些开发板又很丰富的例程,因此使用起来非常方便,但是我们实际在应用的时候,有时候可能用不了那么多的管脚,因此会造成管脚资源的浪费,而且管脚多的成本也会很高。同时这些STM32单片机的基础的库基本都是一样的,因此理论上来说,应该是可以进行移植的,博主今天来分享一下代码移植的方法。本次采用stm32f103rct6的代码移植到stm32f103c8t6。其他STM32单片机之间的移植方式和这个类似,大家要学会举一反三。 博主在做一些项目的...

qq_40305944的博客 4万+

[STM32]从零开始的STM32代码移植教程

讲解了如何移植STM32模块的驱动程序!

c858845275的博客 7812

移植C/C++代码的十个技巧

这篇文章是我翻译自Top 10 tips for code porting c/c++的一篇小短文,以下是翻译全文,如有错误请留言或查阅原文。 代码的可移植性基本上是指使得源代码能够在不同的平台上编译,而不需要源代码进行任何修改。 在脑海里我们知道为保持移植性而编写代码对是重要的。引入代码可移植性的最好方法就是在编码阶段。时时考虑一些事情会使我们实现代码的可...

weixin_30955617的博客 383

STM32F103ZET6代码移植到F103C8T6上的方法及注意事项

这是本次的踩坑记录 https://blog.youkuaiyun.com/ReCclay/article/details/83088268

钓胜于鱼-猿一的博客 1万+

小白学习记录-代码的移植

从字面上理解,可移植性说的就是,在一个平台上开发的代码,通过比较少的改动就能够在另外一个平台上使用。不同的平台可以指具有不同的处理器架构,比如x86和arm;或不同的操作系统,比如windows和linux。程序语言最终会被编译器编译成处理器可以理解的指令,不同的平台编译器或有差别,因此要将代码从一个平台移植到另一个平台,有时会需要对代码做些修改。一般来说,高级的语言具有比较好的可移植性,因为没有

掌心化雪 2494

百度easydl代码集成移植到安卓

百度easydl集成代码移植到Android

qq_45280030的博客 1709

stm32代码移植的方法

这里以stm32f103zet6移植到stm32f103c8t6为例: 1、点开魔术棒–>device中修改芯片型号为stm32f103c8t6 2、点击编译 会提示有一大堆错误和警告 点击第一个错误进入到stm32f10x.h头文件中的#define STM32F10X_HD 将这个宏定义全部屏蔽 这时在编译则没有问题 3、若烧录的时候丢失CORTEX-M3则点击魔术棒中 Utilit...

qq_43758034的博客 4507

【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8

本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。

Witheart 的博客。 1802

编写可移植代码

我们知道,许多嵌入式系统所使用的CPU具有和普通台式机CPU完全不同的构造和特点。但有了操作系统和高级语言,可以最大程度上将这些不同隐藏起来。只要利用高级语言编程,编译器和操作系统能够帮助程序员解决许多和CPU构造及特点相关的问题,从而节省程序开发时间,并提高程序开发效率。...

Bit_Dong的博客 659
上一篇: 使用Qt的QAxObject将Excel文件转成CSV文本文件
下一篇: 7个软件开发原则
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值