首页 > 编程语言 >难说|程序员的品味

难说|程序员的品味

时间:2022-12-13 11:01:35浏览次数:59  
标签:map 01 const 代码 难说 else 程序员 品味 写法

难说|程序员的品味

原杂说难说

缘起

代码里有很多值得商榷的写法。今天来发点牢骚。

写法1

bool bShouldModifyData = false;
if (condition1 && condition2)
{
bShouldModifyData = true;
}
else
{
bShouldModifyData = false;
}

好吧,这种写法逻辑上没问题,但是我觉得可以一行代码更好:

bool bShouldModifyData = (condition1 && condition2);

写法2

// 如果 map 中找到了 key 对应的数据,就用 map 中的数据,否则用 normalData
// if 和 else 中,只有 Method 的参数传递的不一样,其它一模一样
int normalData = 0;
auto it = map.find(key);
if (it != map.end())
{
// lots of code
result = Method(it->second);
}
else
{
// lots of code (same with if)
result = Method(normalData);
}

这样的写法在业务代码中比较多。猜测应该是写好了 ​​if​​ 部分的代码,​​else​​ 部分的代码直接复制粘贴的。我认为上面代码最致命的问题是:如果业务逻辑发生变化,那么需要同时修改 ​​if​​ 和 ​​else​

写代码的时候有一个最基本的原则:DRY (Don't Repeat Yourself)。可以改成下面的样子,代码量不仅少了一半儿,逻辑也更加清晰了。

// 如果 map 中找到了 key 对应的数据,就用 map 中的数据,否则用 someNormalData
// if 和 else 中,只有 Method 的参数传递的不一样,其它一模一样
int normalData = 0;

auto it = map.find(key);
auto funcParam = (it != map.end()) ? it->second : normalData;

// lots of code
result = Method(funcParam);

写法 3

struct HugeStruct
{
// lots of members
};

void DoSomething(HugeStruct data)
{
// ...
}

作为一个有强迫症的 ​​c++​​ 程序员,看到上面的代码,我的直觉告诉我,写这段代码的人或者是不小心,或者是其它语言转过来的。在 ​​c++​​ 里,默认是值拷贝,上面的写法,在调用函数时会把 ​​data​​如果我们不打算修改 ​​data​​ 的内容,那么应该使用 ​​const &​

void DoSomething(const HugeStruct& data)
{
// ...
}

写法 4

int GetMoney(BankAccount& account)
{
return account.money;
}

通过函数名判断,上面的函数只是获取一些值,不会修改参数。但是参数只用了引用修饰,没加 ​​const​​,意味着参数可能在函数内部被修改。让人迷惑。如果不需要修改参数,那么需要加上 ​​const​​。改成下面这样就没有任何歧义了。

int GetMoney(const BankAccount& account)
{
return account.money;
}

注意: 不需要对 int, char, short, double 这种基础类型加 const &

写法 5

class Wall
{
public:
std::vector<Hole> GetHole() { return m_holeVec; }
private:
std::vector<Hole> m_holeVec;
};

上面这段代码中规中矩。但是 ​​GetHole()​

class Wall
{
public:
std::vector<Hole>& GetHole() { return m_holeVec; }
const std::vector<Hole>& GetHole() const { return m_holeVec; }
private:
std::vector<Hole> m_holeVec;
};

有的小伙伴儿就有疑问了,返回引用,被别人改了怎么办?当 ​​Wall​​ 实例是 ​​const​​ 的,那么会调用带 ​​const​​ 的函数,返回的是 ​​const &​​,不会被意外修改。当 ​​Wall​​ 实例是非 ​​const​​ 的,那么会调用不带 ​​const​

写法 6

void ReallyComplexFunction()
{
// start by xxx1 [2022-01-01]
// start by xxx2 [2022-02-01]
// start by xxx3 [2022-03-01]
// idx = 0;
// idx = 1;
// idx = 2;
idx = 0;
// end by xxx3 [2022-03-01]
// end by xxx2 [2022-02-01]
// end by xxx1 [2022-01-01]
}

上面的代码片段是非常典型的,三个同事改了三次,留下了三次改动记录,但是只是为了修改一个小小的地方。放眼望去,全是注释,真正有用的就一句话。

Taste

之前看 ​​Linus​

I personally consider most important when it comes to technical people is this notion of taste.

我特意截取了关键视频,并做了中英文字幕,发到视频号上了。

我觉得每个人的水平,背景,阅历不同,品味有差异是正常的,甚至同一个人在不同时期的品味也不尽相同。希望您也觉得以上几个例子是反面教材。关于代码的品味,您想说些什么的呢?快来视频号留言吧。

欢迎各位小伙伴指出不足,提出建议!感谢关注我的博客:)

作 者:​​编程难​​

码云博客:​​https://bianchengnan.gitee.io​

github博客:​​https://bianchengnan.github.io​

版权所有,转载请保留原文链接:)



标签:map,01,const,代码,难说,else,程序员,品味,写法
From: https://blog.51cto.com/u_15469822/5933159

相关文章

  • 漫画:从架构师“沦落”为普通程序员
    ......
  • #yyds干货盘点# LeetCode程序员面试金典:链表相交
    题目:给你两个单链表的头节点 headA​ 和 headB​ ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目......
  • 程序员真的失业了?这一次,那些还在痴迷技术的人,该醒醒了
    IT行业的底层码农,是青春饭,不要心存侥幸!最近chatGPT应该在IT这个行业刷屏了吧,作为自然语言问答式AI刚发布就风头无两,程序员对其体验之后褒贬不一,让我想起几年前低代码刚出来......
  • 程序员 PK 刘畊宏 | 我用代码实现刘畊宏龙拳
    Hi大家好,我是DHL。公众号:ByteCode,分享有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂程序员来挑战龙拳了,我用代码实现了刘......
  • 《程序员修炼之道》读后感
    不存在有完美的软件,但学会务实的偏执,可以把遗憾变为优势 这个世界上没有任何事情可以达到十全十美,同样,也不可能有完美无缺的软件项目。虽然这是一个比较令人遗憾的现实,......
  • #yyds干货盘点# LeetCode程序员面试金典:回文链表
    题目:编写一个函数,检查输入的链表是否是回文的。 示例1:输入:1->2输出:false示例2:输入:1->2->2->1输出:true代码实现:classSolution{publicbooleanisPalindrome(L......
  • #yyds干货盘点#程序员是做管理还是做技术
    只要有得选,专注技术或是转管理。都可以。但对于大部分程序员来说,都没得选。专注技术,你得有基础,基础太差,技术发展的天花板很低;想转管理,虽然门槛没有专注技术那么高,但是,公司里......
  • 一个程序员的学习成长之路
    一个程序员的学习成长之路小米有品技术团队2021年12月14日09:45 ·  阅读1543这是一篇回忆性的学习经验总结,从笔者zt(现为小米有品高级软件研发工程师,主要......
  • 程序员修炼之道 四
    第八节:正交性1、正交性是一个从几何学中借鉴而来的术语,如果两条直线相交成直角,他们就是正交的。这在向量中的解释是沿着一条直线移动,你投影到另一条直线上的位置不变。在......
  • 程序员修炼之道 三
    第六节:交流1、知道你想要说什么当我们面临会议,重要通话,或者只是撰写技术文档,问下自己你要表达的中心想法是什么,围绕这一点进行展开。2、了解你的听众比如你要做一场分享......