• 如何写出优美的代码


    目录

    1.前言

    2.现象

    3.如何写好代码

    4.案例

    第一例:

    第二例:

    第三例:

    第四例:

    5. 总结


    1.前言

    本文论述内容,纯属个人见解,仅供参考。不做实际指导意见。

    10+年工作经验中,有实际开发以及带队经验,经历过的系统及代码数不清了都,有自己年轻时被领导指导过的代码,有看过开源的代码,有读过其他同事的代码,有Review过队友的代码......

    2.现象

    抛开实现不说,抛开对错不说,我们这次只关注代码的美观上。

    看过这样的代码大家有没有经历过:

    2.1 无注释,通篇干巴巴的代码-没有任何注释提示内容

    2.2 代码一坨, 无任何层次感可言

    2.3 重复代码,害怕改以前的代码,直接复制一份出来做自己的逻辑

    2.4 大量IF/ELSE , if/else 太多,难以改动,改一次都惊心动魄,很难读懂

    2.5 反人类思维,明明if(true)的事,非得用 if(!false)

    2.6 疯狂的大括号{},代码逻辑流转不靠相应的return,throw Exception保证,直接括号 一括到底,各种括号嵌套。

    2.7 流水账式代码- 不分段,不抽取,通体大段代码实现,-读完喘不过气来

    2.8 补丁式代码- 本来一个小算法,小工具方法,可以提取到 工具类中,非得散落在各业务代码中,像一块块补丁,补在崭新的花衣上,怎一个丑字了得。

    2.9 命名随意,胡乱翻译 , 风控 -翻译成 Wind Control - oh 。。。。

    3.0 硬编码- 硬编码已经不合适了,还各种硬编码没解释, 代码中出现的 1,2,啥意思?头疼。。

    等等....

    3.如何写好代码

    先把代码的格式上搞好,再谈实现,代码让人读起来赏心悦目,清爽宜人。自己写的爽,别人看的爽。

    3.1 得先见过什么样的代码是好代码,-井底之蛙认为天就那一块。多涉猎,广交流,多读源码,起码Spring 的源码应该搞定。

    3.2 遵循一个原则:总-分 。 想想写作文时,我们要写个前言,写个目录之类的,所以任何代码段的核心逻辑是及其精炼的,列出 1.xxx 2. xxx 3.xxxx  ,再针对 1.2.3 具体的子方法做相应的实现。

    3.3 找到写代码的感觉-Sense。 沉浸式代码开发中,不以完成任务来写的代码,只是想把他写好,把那段代码当做一个艺术品去加工,反复雕琢,打磨,直至自己满意,一气呵成,岂不快哉!

    4.案例

    下面引用一个实际的案例,看代码是如何一步步从杂乱走向了优雅。

    案例引用自《大话重构》,

    每次到一个新团队,总会和大家过一下这个案例,这个案例也一直影响了自己很多年的代码风格。

    第一例:

    这是一个小算法,根据当前日期,计算出所在上午下午还是晚上,输出对应的打招呼内容

    问题是:

    1.没有注释

    2.顺序编程

    3.没有层次

    4.变量命名不合理

    5.常量抽取......
     

    1. import java.util.Calendar;
    2. import java.util.Date;
    3. public class HelloWorld {
    4. public String sayHello(Date now, String user) {
    5. Calendar c;
    6. int h;
    7. String s = null;
    8. c = Calendar.getInstance();
    9. c.setTime(now);
    10. h = c.get(Calendar.HOUR_OF_DAY);
    11. if (h >= 6 && h < 12) {
    12. s = "Good Morning";
    13. } else if (h >= 12 && h < 19) {
    14. s = "Good afternoon";
    15. } else {
    16. s = "Good night";
    17. }
    18. s = "Hi," + user + ". " + s;
    19. return s;
    20. }
    21. }

    第二例:

    进行了一些优化,可读性增强了些。

    1.增加注释

    2.调整顺序

    3.重命名变量

    4.进行分段

    1. import java.util.Calendar;
    2. import java.util.Date;
    3. /**
    4. * 重构HelloWorld程序
    5. * @author JanhoSong
    6. *
    7. */
    8. public class HelloWorld {
    9. /**
    10. * 向大家问好
    11. * @param now
    12. * @param user
    13. * @return
    14. */
    15. public String sayHello(Date now, String user) {
    16. //获得当前小时
    17. Calendar calendar = Calendar.getInstance();
    18. calendar.setTime(now);
    19. int hour = calendar.get(Calendar.HOUR_OF_DAY);
    20. //获取打招呼正确的语言
    21. String words = null;
    22. if (hour >= 6 && hour < 12) {
    23. words = "Good Morning";
    24. } else if (hour >= 12 && hour < 19) {
    25. words = "Good afternoon";
    26. } else {
    27. words = "Good night";
    28. }
    29. words = "Hi," + user + ". " + words;
    30. return words;
    31. }
    32. }

    第三例:

    再次优化后抽取了可以提取的一些公共方法。

    1. import java.util.Calendar;
    2. import java.util.Date;
    3. /**
    4. * 重构HelloWorld程序
    5. *
    6. * @author JanhoSong
    7. *
    8. */
    9. public class HelloWorld {
    10. /**
    11. * 向大家问好
    12. *
    13. * @param now
    14. * @param user
    15. * @return
    16. */
    17. public String sayHello(Date now, String user) {
    18. int hour = this.getHour(now);
    19. return "Hi," + user + ". " + this.getGreeting(hour);
    20. }
    21. /**
    22. * 获取当前小时
    23. *
    24. * @param now
    25. * @return
    26. */
    27. private int getHour(Date now) {
    28. Calendar calendar = Calendar.getInstance();
    29. calendar.setTime(now);
    30. return calendar.get(Calendar.HOUR_OF_DAY);
    31. }
    32. /**
    33. * 获取打招呼内容
    34. *
    35. * @param hour
    36. * @return
    37. */
    38. private String getGreeting(int hour) {
    39. if (hour >= 6 && hour < 12) {
    40. return "Good Morning";
    41. } else if (hour >= 12 && hour < 19) {
    42. return "Good afternoon";
    43. } else {
    44. return "Good night";
    45. }
    46. }
    47. }

    第四例:

    进一步提取,可以提取的工具类,抽取类出来。

    1. import java.util.Calendar;
    2. import java.util.Date;
    3. /**
    4. * 日期工具类
    5. *
    6. * @author JanhoSong
    7. *
    8. */
    9. public class DateUtil {
    10. /**
    11. * 获取当前小时
    12. *
    13. * @param now
    14. * @return
    15. */
    16. public static int getHour(Date now) {
    17. Calendar calendar = Calendar.getInstance();
    18. calendar.setTime(now);
    19. return calendar.get(Calendar.HOUR_OF_DAY);
    20. }
    21. }
    22. package com.longfor.org4;
    23. /**
    24. * 问候语类
    25. *
    26. * @author JanhoSong
    27. *
    28. */
    29. public class Greeting {
    30. /**
    31. * 获取前部分打招呼内容
    32. *
    33. * @param hour
    34. * @return
    35. */
    36. public String getFirstGreeting(String user) {
    37. return "Hi, " + user + ". ";
    38. }
    39. /**
    40. * 获取后部分打招呼内容
    41. *
    42. * @param hour
    43. * @return
    44. */
    45. public String getSecondGreeting(int hour) {
    46. if (hour >= 6 && hour < 12) {
    47. return "Good Morning";
    48. } else if (hour >= 12 && hour < 19) {
    49. return "Good afternoon";
    50. } else {
    51. return "Good night";
    52. }
    53. }
    54. }
    55. import java.util.Date;
    56. /**
    57. * 重构HelloWorld程序
    58. *
    59. * @author JanhoSong
    60. *
    61. */
    62. public class HelloWorld {
    63. /**
    64. * 向大家问好
    65. *
    66. * @param now
    67. * @param user
    68. * @return
    69. */
    70. public String sayHello(Date now, String user) {
    71. int hour = DateUtil.getHour(now);
    72. Greeting gretting = new Greeting();
    73. return gretting.getFirstGreeting(user)
    74. + gretting.getSecondGreeting(hour);
    75. }
    76. }

    后续我们还可以再进行扩展,将每种打招呼的方法抽取成类,运用设计模式,这样就实现了可扩展,解除了IFelse。

    5. 总结

    写代码是一种享受,而写出的代码即一件艺术品,需要精雕细琢。

  • 相关阅读:
    如何将计算机上有限的物理内存分配给多个程序使用
    HDFS基本操作命令
    基于Alexnet深度学习网络的人员口罩识别算法matlab仿真
    [WebDav] WebDav基础知识
    flutter在mac系统中的环境搭建 - 1
    5.前后端不分离项目的部署
    Centos7下载安装Tomcat应用服务器
    ffplay源码解析-main入口函数
    Perl语言入门学习
    Lagent & AgentLego 智能体应用搭建——笔记
  • 原文地址:https://blog.csdn.net/blucastle/article/details/127930680