代码重构 —— 化繁为简

news/2024/5/19 5:44:21 标签: 重构, JNI, 反射, 渲染, RHI, 架构设计, 代码重构

本文涉及 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 自有一套。


http://www.niftyadmin.cn/n/5331731.html

相关文章

蓝桥杯 java 重复字符串

题目描述 * 如果一个字符串S恰好可以由某个字符串重复K次得到&#xff0c;我们就称S是K次重复字符串。 * 例如 abcabcabc 可以看作是 abc重复3次得到&#xff0c;所以 abcabcabc 是3次重复字符串。 * 同理 aaaaaa 既是2次重复字符串、又是3次重复字符串和6次重复字符串。 * 现在…

7.6 MySQL基本函数的使用(❤❤❤)

7.6 MySQL基本函数的使用 1. 提要2. 数字函数3. 字符函数3.1 替换字符3.2 左填充字符及截取字符串 4. 日期函数4.1 日期函数4.2 表达式占位符4.3 日期偏移计算4.4 日期间隔 5. 条件函数5.1 IF语句5.2 case...when语句 1. 提要 2. 数字函数 3. 字符函数 3.1 替换字符 -- INSERT…

linux简单命令复习

1. 前言&#xff1a; 马上要期末考试了&#xff0c;需要简单复习下linux基本命令&#xff0c;顺便水一篇博客&#xff0c;啊不&#xff0c;写一个总结&#xff0c;总结下课本学习的内容。 2. 基础命令 2.1.文件和目录操作&#xff1a; ls列出当前目录文件、 ls ls -als …

推荐系统模型(一) DFN 详解 Deep Feedback Network for Recommendation

背景 在大多数的推荐系统中&#xff0c;往往注重于隐式正反馈(例如&#xff1a;点击)&#xff0c;而忽略掉用户的其他行为(例如大多数CTR模型只考虑用户的喜欢&#xff0c;而忽略了不喜欢)。腾讯在Deep Feedback Network for Recommendation 一文中&#xff0c;提出了一个新颖…

uniapp返回上一页并刷新数据

在uniapp中&#xff0c;返回页面时onLoad是不会触发的 如果只需要在特定情况下返回上一页才需要刷新数据 可以使用$emit和$no去解决 例如&#xff1a;注册完成后返回到首页并隐藏注册按钮&#xff0c;register.vue和index.vue register.vue <template><view clic…

游戏开发农场游戏休闲娱乐游戏教育益智游戏开发

在当今快速发展的数字时代&#xff0c;游戏开发已经成为一个多元化且创新的领域。游戏不再仅仅是娱乐的手段&#xff0c;它们已经渗透到教育、社交、商业以及日常生活的各个方面。从农场养成游戏到元宇宙的探索&#xff0c;从休闲娱乐到虚拟现实&#xff08;VR&#xff09;和增…

day19【LeetCode力扣】160.相交链表

day19【LeetCode力扣】160.相交链表 1.题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据 保证 整个链…

【排序算法】四、堆排序(C/C++)

「前言」文章内容是排序算法之堆排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 堆排序1.1 原理1.2 堆的向下调整1.3 堆排序代码实现1.3 性质总结 堆排序 1.1 原理 概念介…