代码重构 —— 化繁为简

本文涉及 KISS原则,DRY原则

1 设计层面

1.1 保持架构的一致性,不要另辟新径

比如渲染场景管理中,最扁平的架构:manager / scener / object 三层。

  • 都是1对N的关系
  • 一个mgr管理一群scener,一个scener下面N个object,

一些新手会把object搞成一个,在object下面搞一层 layer,最终object的含义非常不同了,
让我也“眼前一亮”,居然还能这么扩展

1.2 coding的时候,多想一步,不要无脑的直接干

比如类或者结构体,业务A一个struct,业务B一个struct。
好处:物理隔离 没有风险,不会出错,
坏处:代码碰撞,结构体膨胀,

不够简洁,同时触犯了DRY,do not repeat yourself,

2 实战

拿RHI模块来说。见过撇足的设计,耦合了大量的业务类。RHI定义了一层shader,业务模块中又大量的派生,定义出来

XXXShader : public RHI::shader {
   }
YYYShader : public RHI::shader {
   }

不止shader,program,renderer都是配套的,无谓的封装导致结构体膨胀,代码大量冗余。一个业务3个类,N个业务 3*N的增长。

如何解决呢?
结构体本质是不同类型的集合,采用反射的形式进行抽象和提炼。

1)函数的形式:

setUniform1f("key", v1f)
setUniform4f("key", v4f)
setUniformMat44("mvp", mat)

2)静态存储的形式
map< std::key, std::any> ,类似lua的metatable,
any在c++17之后采用,自己网上找一个就行。

3 推广

同样的道理,JNI的交互也经常遇到这类问题。
不好的设计,Java中的一个类,为了对应c++的一个类,硬生生的在JNI层又搞了一个类JXXX 类管理反射相关的信息。

class GuideAreaLayerConfig
{
   
public:
    std::string day_tex;
    std::string night_tex;
    float erase_dis;
}

class JGuideAreaLayerConfig {
   
public:
    static jobject ToJavaObject(JNIEnv* env, const GuideAreaLayerConfig& layer_config);
    static GuideAreaLayerConfig Parse(JNIEnv* env, jobject obj);
    static void RegisterMe(JNIEnv* env);
public:
  static jclass clazz;
  static jfieldID textureDay;
  static jfieldID textureNight;
  static jfieldID eraseDis;
};
class GuideAreaLayerConfig extends LayerBaseConfig {
   
    public GuideAreaLayerConfig() {
   
    }

    public float eraseDis = 3;
    public String textureDay = "";
    public String textureNight = "";
}

也可以利用反射的形式,采用map进行抽象管理,大幅度压缩代码。JNI的类型setter和getter 自有一套。

相关推荐

  1. 代码重构 ——

    2024-01-18 06:28:03       65 阅读
  2. 资源分配图

    2024-01-18 06:28:03       64 阅读
  3. CCF-CSP——因子

    2024-01-18 06:28:03       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 06:28:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 06:28:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 06:28:03       87 阅读
  4. Python语言-面向对象

    2024-01-18 06:28:03       96 阅读

热门阅读

  1. 【排序算法】排序算法的复杂度

    2024-01-18 06:28:03       62 阅读
  2. Jenkins 敏感信息实战指南

    2024-01-18 06:28:03       57 阅读
  3. 使用docker-compose搭建gitlab

    2024-01-18 06:28:03       51 阅读
  4. C语言所有字符串函数举例如何使用

    2024-01-18 06:28:03       57 阅读
  5. ubuntu18.04clion无法进入断点

    2024-01-18 06:28:03       61 阅读
  6. ubuntu 20.04 docker及nvidia-docker2安装

    2024-01-18 06:28:03       50 阅读
  7. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

    2024-01-18 06:28:03       48 阅读
  8. ubuntu 22.04 安装 device-tree-compiler (dtc)

    2024-01-18 06:28:03       54 阅读
  9. mybatis-Plus 的自动填充

    2024-01-18 06:28:03       50 阅读
  10. linux配置DNS主从服务器

    2024-01-18 06:28:03       58 阅读
  11. Python程序员常用的IDE和其它开发工具

    2024-01-18 06:28:03       49 阅读