跨平台移植 | 如何尽快适应大型C++项目?

news/2024/11/24 5:38:10/

问题

题主现在刚加入一个公司,目前做的工作是将一个大型的C++项目从依赖MFC的环境下移植到Mac环境下,代码几千万行是有的。第一次接触这种规模的项目,应该怎么让自己尽快上手。项目里从上世纪九十年代的代码到现在的代码,文件名有全是大写也有全是小写的,变量名有缩写的也有一个字母不拉的,各种不统一看着脑仁子疼 。项目不方便说但是是做设计的的朋友主力生产工具。

题主表面上问的是如何适应大型 C++ 项目,但实际问的是遇到千万行代码的跨平台移植应该怎么做?那我就先说一下题主的实际问题。

题主描述的信息比较少,没有说明目前有多少个人维护此项目,文档是否齐全,各模块之间的耦合高不高,所以我假定题主在的项目组具备维护此代码的能力,并且这个代码本身也是可维护的,如果这个项目交给题主一个人完成,或代码就是屎山,模块之间高耦合,没有文档没有注释,那应当直接跑路。

首先应该评估移植是否可行,如果整个项目的结构比较好的话,应该会保证将平台无关代码和平台相关代码分离到不同的模块中去,所以题主先要理解整个项目的架构代码,一般来说此部分代码不会太多,在理解架构后,找出平台有关模块,并评估工作量之后一个一个去重构这些模块就可以了,当然这个过程不可能会是一帆风顺,但总体来说这件事情还是可以完成的。如果项目没有做平台无关代码分离的话,那么移植就不是一个可行的方案,此时应该考虑重写整个代码,贸然进行移植可能会导致移植的时间成本大于重写的时间成本。

确认移植可行后,代码移植就变成了开发新的平台有关代码,移植问题就变成了一般的开发问题,接下来就可以讨论一下如何开发维护大型C++项目了,需要提前明确几点,首先过于庞大的项目是不可能有人能够了解代码所有细节的,他们都是按模块分不同的人去维护,每个人只负责其中几个模块。维护人员需要有足够的C++基础以确保不会因为语法问题影响对程序理解,同时也需要维护人员了解相应的业务和使用到的技术栈以确保能够理解代码实现的功能。

个人认为上手大型C++项目可以分为以下几个步骤:

1、阅读产品定义或实际使用该软件的主要功能(或自己要维护的功能)

先在宏观上感受产品功能,如果有其他项目相关文档,例如API文档,也应当一并阅读,不一定要完全理解,但是要知道有这个东西,方便真遇到问题了先查找文档。

2、了解代码的构建过程,如果项目使用CMake管理,则先读下CMakeLists

构建部分是大型项目的一个比较好的切入点,能从中了解到依赖关系,文件组织结构,有时程序架构也能从中窥得一二,如果是使用CMake生成跨平台的构建系统,那么CMake中就会有不同平台的构建过程,这可能可以帮助你确定那些代码是平台有关。

3、找到架构部分代码并详细阅读

这可能是最为痛苦的过程,此时是你第一次阅读项目代码,你需要找出架构部分,并理解整个代码的主要设计思路和设计范式,架构部分的代码量通常不会那么大,但是较为难懂,个人认为架构部分必须要完全读懂,这样才能搞明白整个程序是如何work起来的,各组件之间有什么样的关系,这会更好的帮助你理解各个组件的实现。

4、阅读需要维护的模块或在原有架构上开发新模块

在之前三步的基础上,你就可以将重心放在理解业务逻辑上了,一般来说新功能应该尽可能少的改动原有的代码,涉及架构的修改则需要慎之又慎。


http://www.ppmy.cn/news/5054.html

相关文章

把d盘的文件删除了,怎么恢复?d盘的文件删除了怎么找回

把d盘的文件删除了,怎么恢复?通常,我们删除d盘文件的情况是不一样的,可能是通过不同的方法删除的,针对不同的删除方式,那么要恢复这些文件的方法也是不同的,小编按删除方式和时间来给大家进行详细的讲解。 …

全网最详细的网络安全入门教程,一篇文章满足你

随着当下正在发生的互联网革命,以及乌俄局势的网络战,网络安全行业已经受到更多人的关注,而这个行业的人才缺口将继续呈指数型扩张。借用行业内某大咖的一句话“网络安全行业的人才成材率极低”,究其原因还是因为网络安全从业者所…

数据结构和算法(四)--高级排序

目录 二、高级排序 2.1、希尔排序 2.2、归并排序 2.2.1、递归 2.2.2、归并排序 3、快速排序 4、排序的稳定性 数据结构和算法(三)--排序 二、高级排序 冒泡排序,选择排序,插入排序,最坏的时间复杂度都是O(N^2),而平方阶&…

SAP MDG —— License的度量方式

文章目录前言概念业务定义SAP MDG, ConsolidationSAP MDG, Central GovernanceSAP MDG, Data quality management“度规”是什么MDG:财务对象MDG:自定义对象MDG:供应商主数据对象MDG:客户主数据对象MDG:业务伙伴对象MD…

深度学习基础知识---梯度弥散 梯度爆炸

目录 1 梯度弥散、梯度爆炸的成因 2 解决方式 2.1.pretrainfinetune 2.2 梯度裁剪 2.3 权重正则化 2.5 Batch Normalization正则化 2.6 残差结构 shortcut 2.7 LSTM 1 梯度弥散、梯度爆炸的成因 神经网络的层(主要是隐藏层)越多,对…

[附源码]计算机毕业设计Python惠农微信小程序论文(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Allegro如何导出光绘和颜色设置到其它单板上操作指导

Allegro如何导出光绘和颜色设置到其它单板上操作指导 Allegro有个非常强大的功能,支持把光绘设置和颜色设置等等参数从一个PCB导入到另外一块PCB中,如下图 具体操作如下 导出参数设置,file-export选择Parameters

PostgreSQL 导入 SLS,从业务到监控数据

日志服务SLS数据导入简介 日志服务SLS是云原生观测和分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务是提供一站式数据采集、加工、查询与分析、可视化、告警、消费与投递等功能。全面提升在研发、运维、运营、安全等场景的数…