首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么叫代码的可读性?为什么说Kotlin的可读性比Java好?

并且作者举了一个在我看来,不知道该怎么来描述的例子: 这个作者的大意是,上面这段文章,你多读个两三遍,你也会很快的理解它的意思,所以“对于熟练的读者而言,外观很少会成为可读性的障碍。”...确保正确理解一段代码的难易程序 这是很多人会忽略的事情。能否理解一段代码,跟确保正确的理解这段代码,其实中间还是有一些差别的。很多代码看起来很简单,但是要确保自己正确的理解,其实还是非常费劲的。...说回Kotlin,那为什么说Kotlin代码能让人更容易正确的理解呢?...因为我说的是使用来定义变量,但是像上面的这个成员变量,是不能加的,因为它就是要可变的啊,它就是需要在某些条件下被重新赋值的啊,这不是矛盾了吗? 是的,很多时候,我们不能使用来定义一个成员变量。...关于可读性的重要性,其实上面分析什么叫可读性的时候,已经提到了,这里归纳一下,只说两点: 更快的找到你关心的代码,更快的理解代码。 要知道,我们现实开发过程中,大部分时间是在看代码,而不是在写代码。

1.2K70

为什么说Kotlin的可读性比Java好?

并且作者举了一个在我看来,不知道该怎么来描述的例子: 这个作者的大意是,上面这段文章,你多读个两三遍,你也会很快的理解它的意思,所以“对于熟练的读者而言,外观很少会成为可读性的障碍。”...能否理解一段代码,跟确保正确的理解这段代码,其实中间还是有一些差别的。很多代码看起来很简单,但是要确保自己正确的理解,其实还是非常费劲的。...说回 Kotlin,那为什么说 Kotlin 代码能让人更容易正确的理解呢?...像这样的机制还有很多,比如说在 Kotlin 中,if、when(Kotlin 中的 switch)都是表达式(Expression,会返回一些值),而不像在 Java 中,只是语句(Statement...关于可读性的重要性,其实上面分析什么叫可读性的时候,已经提到了,这里归纳一下,只说两点: 更快的找到你关心的代码,更快的理解代码。要知道,我们现实开发过程中,大部分时间是在看代码,而不是在写代码。

1.9K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python编程中的反模式

    在用来迭代序列之外,range的一个重要用法是当你真正想要生成一个数字序列而不是用来生成索引: ? 正确使用列表解析 如果你有像这样的一个循环: ? 你可以使用列表解析来重写: ? 为什么要这么做?...一方面你避免了正确初始化列表可能带来的错误,另一方面,这样写代码让看起来很干净,整洁。 对于那些有函数式编程背景的人来说,使用map函数可能感觉更熟悉,但是在我看来这种做法不太Python化。...因此如果你需要在循环里检查成员,最好先花时间创建set,因为你只需要创建一次。 变量泄露 循环  通常说来,在Python中,一个变量的作用域比你在其他语言里期望的要宽。...这段代码将会正常运行,除非子y为空的情况下,此时,循环永远不会执行,而且processList函数的调用将会抛出NameError异常,因为idx没有定义。...如果你想在其他地方保存positive_numbers是否为空的结果,可以使用bool(positive_number)作为结果保存;bool用来判断if条件判断语句的真值。

    1.4K70

    Python编程中的反模式

    在用来迭代序列之外,range的一个重要用法是当你真正想要生成一个数字序列而不是用来生成索引: 正确使用列表解析 如果你有像这样的一个循环: 为什么要这么做?...一方面你避免了正确初始化列表可能带来的错误,另一方面,这样写代码让看起来很干净,整洁。 对于那些有函数式编程背景的人来说,使用map函数可能感觉更熟悉,但是在我看来这种做法不太Python化。...因此如果你需要在循环里检查成员,最好先花时间创建set,因为你只需要创建一次。 变量泄露 循环 通常说来,在Python中,一个变量的作用域比你在其他语言里期望的要宽。...例如:在Java中下面的代码将不能通过编译: 然而在Python中,同样的代码总会顺利执行且得到意料中的结果: 这段代码将会正常运行,除非子y为空的情况下,此时,循环永远不会执行,而且processList...,可以使用bool(positive_number)作为结果保存;bool用来判断if条件判断语句的真值。

    1.1K00

    Python编程中的反模式

    在用来迭代序列之外,range的一个重要用法是当你真正想要生成一个数字序列而不是用来生成索引: ? 正确使用列表解析 如果你有像这样的一个循环: ? 你可以使用列表解析来重写: ? 为什么要这么做?...一方面你避免了正确初始化列表可能带来的错误,另一方面,这样写代码让看起来很干净,整洁。 对于那些有函数式编程背景的人来说,使用map函数可能感觉更熟悉,但是在我看来这种做法不太Python化。...因此如果你需要在循环里检查成员,最好先花时间创建set,因为你只需要创建一次。 变量泄露 循环 通常说来,在Python中,一个变量的作用域比你在其他语言里期望的要宽。...这段代码将会正常运行,除非子y为空的情况下,此时,循环永远不会执行,而且processList函数的调用将会抛出NameError异常,因为idx没有定义。...如果你想在其他地方保存positive_numbers是否为空的结果,可以使用bool(positive_number)作为结果保存;bool用来判断if条件判断语句的真值。

    1K30

    效率编程 之「泛型」

    如果要使用泛型,但不确定或者不关心实际的类型参数,就可以使用一个问号代替,称之为“无限制的通配符类型”。此外,在类文字中必须使用原生态类型(但是允许使用数组类型和基本类型),而不允许使用参数化类型。...由于泛型信息可以在运行时被擦除,因此在参数化类型而非通配符类型上使用instanceof操作符是非法的。总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。...每当使用@SuppressWarnings("unchecked")注解时,都要添加一条注释,说明为什么这么做事安全的。...isEmpty()) { st.add(pop()); } } 如果目标集合的元素类型与堆栈的元素类型完全相同,这段代码编译时还是会正确无误,运行得很好。...结论很明显,为了获得最大限度的灵活性,要在表示生产者或消费者的输入参数上使用通配符类型。

    61340

    为什么日志要private static final

    对象传递给getLog()方法,而不是字符串。...为什么声明日志记录器是私有的、静态的和final的良好实践呢?日志记录器是一个内部实现细节,因此它应该是私有的。对于类的所有实例,您只需要一个日志记录器,因此是静态的。...并且记录器不能被替换,因此是最终的。所以如果这是好的,有什么不好的(至少在我看来)?Simple——任何不是私有的、静态的、final的记录器,并且不会将Class对象传递给getLog()!...嗯,它不是静态的。另一方面,它使用getClass()来获取日志。起初,这似乎很有效,因为现在所有子类都自动继承了正确运行时类型的现成的日志。这里出了什么问题?...以这种方式声明的日志记录器的最大问题是,您现在从超类中获得的所有日志记录与子类的日志记录混合在一起,并且在日志输出中,除非您查看源代码,否则无法识别哪些消息来自哪个类。

    2.2K20

    Python编程中的反模式

    print i, alist[i] 不恰当地使用range的常见理由: 1. 需要在循环中使用索引。...一方面你避免了正确初始化列表可能带来的错误,另一方面,这样写代码让看起来很干净,整洁。对于那些有函数式编程背景的人来说,使用map函数可能感觉更熟悉,但是在我看来这种做法不太Python化。...应该记住:创建set引入的是一次性开销,创建过程将花费线性时间即使成员检查花费常数时间。因此如果你需要在循环里检查成员,最好先花时间创建set,因为你只需要创建一次。...> max_value: break processList(y, idx) 这段代码将会正常运行,除非子y为空的情况下,此时,循环永远不会执行,而且processList函数的调用将会抛出...,可以使用bool(positive_number)作为结果保存;bool用来判断if条件判断语句的真值。

    1.1K60

    Java编码规范

    Java 注释约定 一个很好的可遵循的有关注释的经验法则是:问问你自己,你如果从未见过这段代码,要在合理的时间内有效地明白这段代码,你需要哪些信息。 2.1....一般概念 n 注释应该增加代码的清晰度 n 保持注释的简洁 n 在写代码之前写注释 n 注释出为什么做了一些事,而不仅仅是做了什么 2.2....不要在源文件中保存Tab字符, 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度。...下面的例子说明括号和空格的错误及正确使用: CallProc( AParameter ); // 错误 CallProc(AParameter); // 正确 不要在语句中使用无意义的括号,括号只应该为达到某种目的而出现在源代码中...n 尽量使用接口而不是一个具体的类 比方如下需求,给定一个SQL语句,返回一个对象的列表,实现中用java.util.ArrayList实现,于是定义方法为: public java.util.ArrayList

    91840

    代码优化的 5 大原则,第 1 条相信你一开始就没想到!

    在其中的一个读取页面上,被塞了一个等待语句,程序到这里就停上 20 秒。 这大约是原来调试这段代码的程序员在排查的过程中插入的等待命令,结果在将代码合并进生产环境的时候忘记把这行东西去掉了。...你需要明确而简单地说明这个目标,简单到就算技术理解能力最差的部门经理也能够理解和复述它。 你需要在整个过程中坚持这些目标。 要开始这项工作,最好的办法是,根据对目标的影响确定每项任务的优先顺序。...还有的分析器能列出每个命令的执行次数,被频繁执行的那些命令,在总占用时间上的权重肯定更高,而完全没被运行的那些命令,往往就是一些无用的代码,或者没有经过合适测试的代码。...一个好的分析工具,最有用的地方就是能让你发现软件中的“热点”,也就是消耗了最多运行时间的那些函数或者命令语句。基本上如果你发现了一个热点,你也就发现了问题所在。...将常用的表达式计算归集在一起 如果同一个非常消耗性能的计算在多个地方重复出现,最好能只在一个地方进行计算,然后记住计算结果。除非必要,否则不要在循环中进行这样的计算。

    41010

    世间本无完美代码,不要苦苦追寻了

    你一直在改变的代码怎么样了呢?纠结于代码风格以及提出最优雅的解决方案是浪费时间,因为这段代码可能会再次更改,甚至可能会在几天或几周内重写。...忘记代码风格(除非代码风格变成无法理解)。让你的 IDE 处理代码格式化。不要争议代码是否应该是“更多的 OO”。只要它有意义,它是否适当地遵循这种或那种模式并不重要。无论你喜欢还是不喜欢都没关系。...你是否有更好的方式做到这一点并不重要 —— 除非你在教新接触这个平台或者语言的人,而且需要在做代码审查时做一部分指导。 写测试很重要。测试涵盖主要流程和重要的意外情况。...“经过五年的使用和修改,成功的软件程序的源码通常完全认不出它原来的样子,而一个成功建筑五年后几乎没有变化。”...即使设计和代码是正确的,它们也可能只是一段时间内正确,直到环境要求再次更改或替换为更好的东西。 我们需要编写好的代码:代码可以理解、正确、安全和可靠。

    97590

    golang新手容易犯的3个错误

    3func main() { 4 var s []int 5 s[0] = 1 6} 上面的代码将产生一个panicruntime error:index out of range,正确做法应该是使用...这是因为golang中变量的作用域范围小到每个词法块(不理解的同学可以简单的当成{} 包裹的部分)都是一个单独的作用域,大家都知道每个作用域的内部声明会屏蔽外部同名的声明,而每个if语句都是一个词法块...,也就是说,如果在某个if语句中,不小心用:=而不是=对某个if语句外的变量进行赋值,那么将产生一个新的局部变量,并仅仅在if语句中的这个赋值语句后有效,同名的外部变量会被屏蔽,将不会因为这个赋值语句之后的逻辑产生任何变化...在golang中,array和struct都是值类型的,而slice、map、chan是引用类型,所以我们写代码的时候,基本不使用array,而是用slice代替它,对于struct则尽量使用指针,这样避免传递变量时复制数据的时间和空间消耗...这个报错的意思其实就是不允许修改map中的元素。 即便map中元素没有以上限制,这段代码依然是错误的,想一想,为什么?答案之前已经说过了。

    1.4K41

    为什么我讨厌 Scrum?

    在我看来,这真的是一种伟大的管理方法,能够最大限度地提高员工的加班时间,而更令人惊奇的是,我们并没有任何一个联盟来反对这个情况。...我自己认为,需要在一周 40 个小时的工作时间之外处理的事情都应该是罕见的紧急情况。 2Done “Done”也是 Scrum 中的一个关键术语。...更经典的是: “起草这份文档需要 3 个月的时间,因为我们需要在设计就绪时把它们加进去。” “那么你必须把整个文档分成两周的增量,以表明我们始终有一个完成的文档,随时可以交付。”...“但它要到最后才能交付,为什么要假装?” 我完全同意每个任务都应该有一个“Done”的定义,但是定义应该是与任务相关的,确定实际做成什么样算是“Done”可能是需要完成的第一个任务。...文档可能对每个 API 都有充分介绍,但仅仅如此你是不知道什么时候为什么使用什么 API 的。

    42310

    一次线上接口超时的排查过程

    原因我已经分析的清清楚楚,但是具体是哪一步除了问题呢,唯一能想到的是这里两次查询使用的是同一个rows对象,是不是某种情况导致在前一次已经关闭了连接而下一次查询直接使用了关闭的连接而导致超时呢?...此时报警开始越来越频繁,于是将这里两次查询由原来的一个rows接收改为使用两个rows分别接收并关闭,然后提交代码,测试通过后开始上线。 6、短暂的风平浪静 代码上线后,效果立竿见影。...除非,像文章《Go组件学习——database/sql数据库连接池你用对了吗》里说的一样,在row.Next()过程中提前退出且没有rows.Close()语句,才会造成下一次查询拿不到连接的情况,即如下代码所示...所以应该是超过maxConn,导致后面的查询任务拿不到连接只能等待,等待到超时时间后还是没有拿到连接,所以触发上面说的cancel,从而也导致在上游看到的超时告警都是ServiceM的getServiceMMethod...那么为什么图中有超过Y的时候没有一直报警呢,我理解应该是这期间有其他任务已经执行完查询任务将连接放回连接池,后面来的请求就可以直接使用了,毕竟还会有一个超时时间的等待窗口。

    1.1K20

    代码优化的 5 大原则,第 1 条相信你一开始就没想到!

    在其中的一个读取页面上,被塞了一个等待语句,程序到这里就停上 20 秒。 ? 这大约是原来调试这段代码的程序员在排查的过程中插入的等待命令,结果在将代码合并进生产环境的时候忘记把这行东西去掉了。...你需要明确而简单地说明这个目标,简单到就算技术理解能力最差的部门经理也能够理解和复述它。 你需要在整个过程中坚持这些目标。 要开始这项工作,最好的办法是,根据对目标的影响确定每项任务的优先顺序。...一个好的分析工具,最有用的地方就是能让你发现软件中的“热点”,也就是消耗了最多运行时间的那些函数或者命令语句。基本上如果你发现了一个热点,你也就发现了问题所在。...将常用的表达式计算归集在一起 如果同一个非常消耗性能的计算在多个地方重复出现,最好能只在一个地方进行计算,然后记住计算结果。除非必要,否则不要在循环中进行这样的计算。...但从长远来看,如果你把那些低效的代码留在原地,未来你将不得不付出成倍的工作量,去检查为什么代码的运行要花上这么长的时间——那时的你一定会感激现在的自己。所以说,不要让现在的偷懒成为你未来的痛苦。

    88320

    如何判断Javascript对象是否存在

    对了,if语句判断myObj是否为空时,这个变量还不存在,所以才会报错。改成下面这样,就能正确运行了。   if (!...myObj) { var myObj = { };   } 为什么加了一个var以后,就不报错了?难道这种情况下,if语句做判断时,myObj就已经存在了吗?...Javascript解释器,只"提升"var命令定义的变量,对不使用var命令、直接赋值的变量不起作用,这就是为什么不加var会报错的原因。...因此,这里只能使用"比较运算符"(==),如果这里使用"精确比较运算符"(===),就会出错。 第九种写法 还可以使用in运算符,判断myObj是否为顶层对象的一个属性: if (!...如果只判断对象是否存在,推荐使用第五种写法。 2. 如果除了对象是否存在,还要判断对象是否有null值,推荐使用第一种写法。 3. 除非特殊情况,所有变量都应该使用var命令声明。 4.

    2.8K110

    请不要在 Vue 中滥用“watch”功能,拜托了!

    随着 Vue 3 的 Composition API 风格的普及,使用 watch 的成本越来越低。现在,我们可以在任何地方使用 watch 来监听响应式数据。...:我们猛地一看,好像并没有什么大问题,但是当我们几个月之后回来再改这段代码的时候,就会发现这里面的问题了我们以 dataList 变量为例,追根溯源来理清这个组件的业务逻辑。...watch 语句,导致了“屎山代码”。...当然,这种代码的编写过程也被视为 “防御性编程”解决方案看到前面示例的缺点后,静下心思考一下, 到底可维护的代码应该是什么样的?...到时候,watch 到处更新 dataList 值,你完全理不清楚这个值到底因为什么变化而变化。所以我们在日常编码的时候,就应该将数据的来源区分成同步变更 还是 异步变更。

    46410
    领券