程序员的上帝视角(2)——我所体悟的思维方式

news2024/11/26 18:29:39

心外无物

仍然记得在高中阶段,总是为了没有解题思路而苦恼。现在回想起来,总算有点感悟——执着于做题、刷题,却忽视了最本质的思考,为什么可以有这样的解题思路,别人是如何想到这种解题思路的。

这正是心学所提倡的,我们需要“心外无物”。所有事物的本质,并不在事物之中,而在我们自己心里。我们必须用自己心来掌控知识。学习一门知识,并不是知道其原理,而是需要体会到这样的设计、思路到底体现了怎样的思想。

关于思维方式的陷阱

我们经常在网络上看到类似“xxx的13种定级思维方式”的视频或者文章。读了之后,略有感触,但却无法实际运用。这其实是将所有情况都罗列出来,“总有一款适合你”,从而导致我们掉入选择的陷阱。

真正适用自己的思维方式,一定是自己体悟出来的

我无法认同那些“n种顶级思维方式”的说法。因为真正适合自己的,仅仅只有一种,而且,完全是个人体悟出来的。当然,这种体悟可能是在接收了大量信息后,瞬间感悟到的,

我无法认同那些“n种顶级思维方式”的说法。因为真正适合自己的,仅仅只有一种,而且,完全是个人体悟出来的。当然,这种体悟可能是在接收了大量信息后,瞬间感悟到的,

具体到技术而言,在解决某个问题,或者重构某段代码后,我往往会问自己,这到底体现了一种什么样的思想。并不断思考这个问题,试图从庞大的汉语言文化中,用两个字来概括这种思想。直至找到那个关键词。而这个关键词只有两三个字,并且能够真正直击个人心里,让自己瞬间感觉对于整个事情的认知尽在掌握之中。而且这两个字能够触动自己的思想。凭借这种方法来强迫自己的思考,不断思考,不断挖掘自己大脑中思考的深度。这是一个反复的过程,你会想到各种词语进行概括,但只有一个词能够让你满意。我想,这可能才是心学所提倡的“心外无物”。

首先要解决的问题——精确

在程序员的日常思维里,一旦说到代码划分,最容易想到的就是代码的分层。以最常见的MVC或者DDD为例,常见的代码结构划分如下:

无论是MVC还是DDD的概念中,代码层次是从所担负的职责来划分的。例如,Controller层负责处理控制;Service层负责处理业务逻辑;DAO层负责处理数据库操作。除了xxxContoller, xxxService,xxxDAO等类之外。常规的代码还包含了DO,DTO,VO,以及一些Convert类。

一个常见的DO类如下所示:

@Data
public class CommonDO {
    public static final String FIELD_ID = "ID";
    /**
     * 自增id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 创建人id
     */
    @TableField(value = "create_user_id", fill = FieldFill.INSERT)
    private Long createUserId;
    /**
     * 创建人
     */
    @TableField(value = "create_user", fill = FieldFill.INSERT)
    private String createUser;
    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * 最后修改者
     */
    @TableField(value = "update_user", fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    /**
     * 最后修改时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

DAO层往往用于与数据库打交道。一个典型的Repository类的示例代码如下:

@Service
public class SubjectRepositoryImpl implements SubjectRepository {
    @Resource
    private SubjectMapper subjectMapper;
    @Override
    public Long addSubject(Subject subject) {
        SubjectDO subjectDo = SubjectDoConvert.INSTANCE.dto2Do(subject);
        subjectMapper.insert(subjectDo);
        return subjectDo.getId();
    }
    @Override
    public int updateSubject(Subject subject) {
        SubjectDO subjectDo = SubjectDoConvert.INSTANCE.dto2Do(subject);
        return subjectMapper.updateById(subjectDo);
    }
    @Override
    public Subject findById(Long id) {
        SubjectDO subjectDo = subjectMapper.selectById(id);
        return SubjectDoConvert.INSTANCE.do2Dto(subjectDo);
    }    
}

很明显,DO类,往往与数据表结构一一对应;而Repository类(及其接口)也都以增删改查的操作为基础。这些代码,往往都是有一定规则的;而且不涉及复杂的业务逻辑。我们可以认为,这些代码都是模板代码。

无论采用MVC还是DDD,对于数据表的增删改查往往是绕不过去的。而对应于单个数据表所产生的类,可能会达到10个之多。在一个典型项目中,可能会出现如下Java类:

DO、DTO、VO、Service、ServiceImpl、Repository、RepositoryImpl、Mapper、Controller、DOConvert、DTOConvert

这些类的代码,是完全有规律可循的。例如,类所处的模块和包的位置、类的命名、类中的属性命名、方法的基本内容、局部变量的命名、各类之间相互的引用关系等等。严格说来,程序员必须遵循统一的标准来编写这些类。也只有遵循统一的标准,才能让所有模块的代码看起来,如同出自同一人之手。无论是后期的维护还是扩展,每位项目成员都可以做到轻车熟路。

对于这类代码,我们可以用精确来概括。一方面是说,代码的编写有迹可循,不应该出现不同风格;另外一方面也是说,它们完全是可以自动化生成的。

利用插件生成精确代码

根据当前公司使用的代码框架和所使用的IDE,开发对应的插件来生成模板代码,是目前最好的方案。利用插件来生成代码,可以无缝集成到IDE、自动将生成的代码置入对应的module,并自动完成相互引用、自动编译等动作。

以上个人开发的集成到Itellij和Eclipse编写的插件,用于生成模板代码。这样生成的代码,无需程序员关注,并且精确生成到各个子模块、包中。

从精确代码中解放出来

一旦解决了日常没有太多技术含量的模板代码,我们的注意力,便可以集中到如何提升技术认知上来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

189、【动态规划】leetcode ——312. 戳气球(C++版本)

题目描述 原题链接:312. 戳气球 解题思路 (1)回溯法 很多求最值实际上就是穷举所有情况,对比找出最值。因为不同的戳气球顺序会产生不一样的结果,所以实际上这就是一个全排列问题。 class Solution { public:int r…

linux shell 入门学习笔记18 函数开发

概念 函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。 优点 将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发…

新:DlhSoft Gantt Chart for WPF Crack

用于 Silverlight/WPF 4.3.48 的 DlhSoft 甘特图灯光库 改进甘特图、网络图和 PERT 图表组件的 PERT 关键路径算法。2023 年 3 月 2 日 - 17:09新版本特征 改进了甘特图、网络图和 PERT 图表组件的 PERT 关键路径算法。Silverlight/WPF 标准版的 DlhSoft 甘特图灯光库 DlhSoft …

精选博客系列|面向公共安全的SD-WAN Edge:刷新VMware边缘计算栈

在巴塞罗那举行的 2023 世界移动通信大会上,VMware 展台展示了配备小型加固 SD-WAN 设备、搭配用于自动车牌识别等应用的 Jenoptik 软件的特斯拉汽车。VMware SD-WAN 能够在车队中创建移动办公室,实现安全的移动通信和实时边缘计算。 萨里和苏塞克斯警方…

如何做好固定资产管理?易点易动高能解决方案来了

企业固定资产管理一直以来都是企业开源节流的重中之重。在当前的数字化时代中,固定资产需要数字化支撑,实现固定资产的有序、科学管理,以便尽可能实现物尽其用,让处于高速发展期中的企业节约在固定资产上的投入成本。 如何做好固…

B站的多个视频教程,怎样生成一个二维码?

商业插画视频教程、电商运营视频教程、在线网课视频、舞蹈视频教程、摄影视频教程、语言学习教程、纪录片视频…所有你发布在哔哩哔哩上的视频,都可以放在一个二维码里面。 任何人只要扫描这个二维码,就能在线观看你的这些视频教程!分享起来…

渗透测试之地基服务篇:无线攻防之钓鱼无线攻击(上)

简介 渗透测试-地基篇 该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。 请注意 : 本文仅用于技术讨论与研究,对于所有笔记中复现…

【Spring6】| Bean的作用域

目录 一:Bean的作用域 1. singleton(单例) 2. prototype(多例) 3. 其它scope 4. 自定义scop(了解) 一:Bean的作用域 1. singleton(单例) (1…

【机器学习】TP TN FP FN及IoU的关系

TP(True Positives): 真的正样本 【正样本 被正确分为 正样本】TN(True Negatives): 真的负样本 【负样本 被正确分为 负样本】FP(False Positives): 假的正样本 【负…

我做测试的3次能力飞跃,让我直接进了字节

回顾我从小公司到字节的成长路径,基本上是伴随着“3次能力飞跃”实现的。 第一家入职的时候是一家小公司,当然我也想直接去字节,可惜自己能力不足。 刚开始入行的时候,什么也不懂,就是从最简单的手工测试做起。每天做…

想开发IM集群?先搞懂什么是RPC!

即时通讯网官方技术群和社区里,经常有开发者在纠结怎么开发IM集群,虽然真正的使用人数,可能用个人电脑单机都能支撑。你也许会说,明明不需要用到IM集群,干吗要自找麻烦?答曰:“老板说这个得有&a…

I.MX6ULL内核开发0:linux内核模块

目录 简要 一、内核模块的概念 二、内核模块加载、卸载过程 简要 1、内核模块的概念 2、内核模块的原理:内核模块在内核的加载、卸载过程。 一、内核模块的概念 内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最…

Prim和Kruskal的区别?哪个好?

Prim和Kruskal有啥区别?到底哪个好? 今天做了一道最小生成树的题,发现了一点猫腻! 题目在这里 : 《修路问题1》 文章目录Prim和Kruskal有啥区别?到底哪个好?先说结论PrimKruskal修路问题1——…

EPICS Phoebus手册1

1、介绍 Phoebus是一个控制系统Stdio工具集的更新,它移除了对Eclipse RCP和SWT的依赖。 虽然Eclipse RCP快速启动了原先的CS-Studio的实现,并且为CS-Stdio也提供了大约十年的服务,因为RCP也增加了对控制系统用户接口开发的限制。 Phoebus项目…

【Spring源码】AOP的开端:核心对象创建的准备工作

AOP的核心成员是如何被被加载的?本篇我们主要分析使用xml的逻辑,如果使用注解,增加注解处理类即可(ConfigurationClassPostProcessor)拿之前分析循环的时候举的例子🌰,它的日志切面就是通过xml进…

119.(leaflet篇)文字碰撞

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

如何从 Android 手机上的 SD 卡恢复已删除的照片

为了扩展手机的存储空间&#xff0c;很多人都会在安卓手机上插入一张SD卡来存储一些大文件&#xff0c;比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便&#xff0c;但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼&#xff1f;…

工作中常用且容易遗忘的css样式整理,建议收藏

1. 文字超出部分显示省略号单行文本的溢出显示省略号&#xff08;一定要有宽度&#xff09;p{width:200rpx;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}多行文本溢出显示省略号p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: …

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考 那什么是FPGA芯片呢&#xff1f;FPGA全称为&#xff1a;现场可编程逻辑门阵列&#xff08;Field-Programmable Gate Array&#xff09;&#xff0c;是基于通用逻辑电路阵…

C语言实现顺序表(pushback pushfront popback popfront insert erase find)

顺序表&#xff0c;是常用的一种数据结构&#xff0c;他的底层是连续的物理内存&#xff0c;所以他可以在O&#xff08;1&#xff09;的时间访问下标为N的位置&#xff0c;而且很多操作都是基于顺序表才可以操作的&#xff0c;例如:排序 所以顺序表是很重要的&#xff0c;他和…