前言

由于最近接触的新技术很多,基本上都是在捣鼓新技术,没有时间去考虑代码的质量问题。因此我需要专门挑一个时间来对前段时间的代码进行总结学习,并且从其他人的代码那获取知识。这篇文章用于记录想法,或者做笔记。如果有人能够看到这篇文章并且从中获得一些经验,这是我的荣幸。

NextJs 代码学习

通过类型规范代码

interface OrgBase {
    name: string;
    desc: string;
    icon_url: string;
    type: "ASSOCIATION" | "TEAM" | "GROUP" | "OTHERS" | null;
}

interface OrgToSendProps {
}

interface OrgToReceiveProps {
    id: string;
}

export type OrgToSend = OrgToSendProps & OrgBase;

export type OrgToReceive = OrgToReceiveProps & OrgBase;

学会自己造类型并进行扩展,类型根据需求而定。

构建合适的抽象层级

层级的抽象一定是要做“减少代码量”和“结构清晰”的结合,不应该盲目抽象。且抽象层级可以是在一个很小的范围,比如一个 components 文件夹,他既可以放置在项目的根目录中,也可以放置在一个小功能的文件夹中。

也许抽象层级应该从小入手,当你在写 article 功能的时候,你发现了一个可以抽象的部分,这个时候可以先抽象到 article 的目录下而非整个项目的文件夹下。

而像检测用户是否登录这样的功能,应该放到 NextJs 的 layout.ts 中

学会用 ctrl + LMB 查看库的定义

有时候官方文档并没有给出这样的类型,你需要自己查看

善用 useState 和 箭头函数

const [notices, setNotices] = useState([] as NoticeToReceive[]);
const [infoIdOptions, setInfoIdOptions] = useState(new Map<string, string>());
const [currentNotice, setCurrentNotice] = useState({} as NoticeToReceive);
const [openEditModal, setOpenEditModal] = useState(false);
const [openAddModal, setOpenAddModal] = useState(false);	//不过我觉得这里的命名不是很好,除非有很好的命名,要不然就要在变量名中添加类型的信息,比如isOpenAddModel

  • 当你把一个非箭头函数赋值给一个 onClick 时,这个函数会在页面初始化时被执行,这和 React 的生命周期和语法有关(也许

Flutter 代码学习

数据和实现分离

在类中保管好 height 等数据,命名要严谨规范,一看到就知道这个数据影响的是哪个地方

私有公用函数分离

  • 如果是单文件程序,那么只能在该文件中编写私有公用函数,这些函数的命名应该遵循以下划线开头

  • 如果一个功能以文件夹为单位,那么可以考虑在该文件夹下新建一个专门防止私有公用函数的文件夹或者文件。

比较以上两点,我认为第二点更好,因此之后写一个功能的时候会偏向于以文件夹为单位

Unity 代码学习

单例模式

  • 提供全局接口

  • 控制全局行为

对于游戏开发,最好实现自动注册子模块,在 Unity 中把模块拖进 GameObject 后不需要手动在全局接口中取消注册即可运行。

命名规范

总需求

  • 命名时把自己当作没有接触过这个项目的人,看看从他们的角度看能不能看懂这个变量或者函数具体是干什么的,命名要严谨概括功能。

  • 命名时不要使用缩写,防止IDE会自动帮你补全

C#

  • 函数:

    • 首字母大写驼峰命名法。如:GenEmptyGameObject

  • 类成员变量:

    • private:下划线开头,首字母小写驼峰命名。

    • protected:同 private

    • public:首字母小写驼峰命名

  • 类私有函数:

    • 下划线开头,首字母大写驼峰命名法

  • 常量和枚举:

    • 常量使用首字母大写的驼峰命名法,且开头加上字母C,如 CMaxSize, CDefaultColor

    • 枚举类型使用首字母大写的驼峰命名法,枚举值也遵循相同的规则,如 enum Color { Red, Green, Blue }

  • 委托

    • 通常以委托结束动作命名,使用首字母大写的驼峰命名法,如 public delegate void ProcessCompleted();

  • 参数:

    • 使用首字母小写的驼峰命名法,如 CalculateValue(double baseValue)

  • 命名空间:

    • 使用首字母大写的驼峰命名法,通常基于公司的名称和功能,如 Microsoft.Graphics

  • 类型参数:

    • 泛型类型参数通常以大写字母 T 开头,如 TValue, TKey

  • 接口:

    • 接口类型以I 开头,如 IService

TypeScript

  1. 变量和函数(Variables and Functions):

    • 使用首字母大写的驼峰命名法(UpperCamelCase),例如:let MyVariable, function MyFunction()

  2. 类和接口(Classes and Interfaces):

    • 使用首字母大写的驼峰命名法(UpperCamelCase),例如:class UserAccount, interface Serializable

    • TypeScript 中的接口命名不一定要像 C# 那样以 I 开头。

  3. 类型别名和枚举(Type Aliases and Enums):

    • 类型别名和枚举也使用首字母大写的驼峰命名法,例如:type StringOrNumber = string | number;, enum Color { Red, Green, Blue }

  4. 常量(Constants):

    • 对于真正不变的值(如配置、环境变量等),可以使用全部大写字母和下划线分隔的命名方式,例如:const MAX_USERS = 10;

    • 对于只在声明时赋值但不再修改的变量,使用首字母小写的驼峰命名法。

  5. 模块(Modules):

    • 模块名通常使用小写字母,如果由多个单词组成,可以使用连字符(kebab-case),例如 import * as myModule from "my-module";

  6. 文件名(File Names):

    • TypeScript 文件名建议使用小写字母,如果是多个单词,使用连字符连接,例如 user-profile.ts

  7. 泛型参数(Generic Parameters):

    • 泛型参数通常用一个大写字母表示,如 TUV,例如 function identity<T>(arg: T): T { ... }

    • 当泛型有具体的类型约束时,名称应更具描述性,例如 function getKey<K extends keyof T>(obj: T, key: K) { ... }

Life is a Rainmeter