iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么写最少的代码
  • 331
分享到

怎么写最少的代码

2023-06-15 21:06:28 331人浏览 安东尼
摘要

本篇内容介绍了“怎么写最少的代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java:我想返回多个返回值秀一下Go的多返回值:packag

本篇内容介绍了“怎么写最少的代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java:我想返回多个返回值

秀一下Go的多返回值:

package main import "fmt"  // 返回 X + Y 和 X * Y func Computer(X, Y int) (int, int) {     return X + Y, X * Y }

众所周知,Java仅支持单一返回值,一般情况下如果需要返回多个对象,我们会根据代码语义选择容器或者新建一个新的类,把我们需要的数据包起来。

这样做有没有问题?当然没有问题,但是瑕疵就在于:可能会产生没啥语义但又不得不存在的中间类,我个人非常讨论该类代码,那么该如何解决这种问题呢?

首先需要认识到,解决方案必须满足几个要求:

  • 代码可复用

  • 语义要清晰

  • 安全

既然如此,我们可以采用泛型来满足复用、语义清晰的要求,用中间类来满足代码安全性的要求,代码如下:

public class MultipleTwoReturn<A, B> {          private final A first;           private final B second;      public MultipleTwoReturn(A first, B second) {         this.first = first;         this.second = second;     }      // 省略Get方法 }

同时,我们可以依赖于继承,让该工具类拓展更多的参数:

public class MultipleThreeReturn<A, B, C> extends MultipleTwoReturn<A, B> {           private final C third;      public MultipleThreeReturn(A first, B second, C third) {         super(first, second);         this.third = third;     } }

测试类:

public class MultipleApp {      public static void main(String[] args) {         MultipleTwoReturn<Integer, String> returnTest = MultipleApp.getReturnTest();         System.out.println(returnTest.getFirst());         System.out.println(returnTest.getSecond());     }      private static MultipleTwoReturn<Integer, String> getReturnTest() {         MultipleTwoReturn<Integer, String> demo = new MultipleTwoReturn<>(0, "Kerwin Demo.");         return demo;     } }

本质还是普通对象,但是加上泛型后威力剧增!由于在方法定义时就强制了泛型约束,语义非常清晰,同时可以完全杜绝上述的无语义中间类,当然一些必要的,有业务含义的组装类,不建议使用这种方式。

泛型:我想new一个对象

大家在学Java泛型之初有没有这种想法?我想利用作为泛型约束,却需要new一个T,但是Java它new不出来啊 ?

很久之前我在写一个通用的Java爬虫接口,里面有一个功能就是传入目标网页的即可获取到针对不同网页设计的Bean,大概如下所示:

public interface SpiderBeansHandle<T> {          String getUrl();           String getCookie();           String getSelector();          // ....  }

中间关键的一点即如何获取到这个Bean,那个时候我只有一个想法:new 一个 T

事实证明,我过于天真了 ?

但是换种思路,既然new不出来,那我就返回一下吧,于是代码出炉了~

public interface SpiderBeansHandle<T> {           String getUrl();           String getCookie();           String getSelector();           T parseElement(Element element);           static <T> List<T> getBeans(SpiderBeansHandle<T> handle) {         List<T> list = new ArrayList<>();         List<Element> elements = SpiderUtils.getElementWithCookie(handle.getUrl(), handle.getSelector(), handle.getCookie());         for (Element element : elements) {             T bean = handle.parseElement(element);             if (bean != null) {                 list.add(bean);             }         }         return list;     } }

关键一步就在于:

 T parseElement(Element element);

那么这个小技巧有什么用呢?仔细看会不会觉得它像一种设计模式的变形体?没错!真相只有一个:模板方法模式

我刚提到了我需要一个处理爬虫的通用接口,因为简单爬虫无非就是拿到url然后请求,解析细节封装到自身的Bean里,然后获取一个列表,那么在开发业务代码的时候类似,肯定有某些场景和需求具有高度的一致性,那么使用这种设计方案即可大大的减少重复代码~

方法:你到底想干嘛?

咱们在写代码的时候有没有遇到过这种问题?写了一个工具类方法,但是功能又过于单一,虽说单一原则好吧,但是一个小逻辑写一堆方法,总感觉不得劲,如何解决咧?

Java8提供的函数式编程即可帮我们一定程度上解决这种问题,如:

// 写一个获取文件列表,且判断是否为txt结尾的工具类方法,新手会这么写 public static File getFileWithTxt(String path) throws ioException {     File file = new File(path);     if (!file.exists()) {         throw new IOException("File is not exist.");     }      if (file.getName().endsWith(".txt")) {         return file;     }      return null; }

老手一般会把 .txt 作为参数传入,但是某一天我需要判断文件大小,文件长度,甚至是文件内容的时候,我该咋办?再写N个?

最好的方案即传入 Predicate 谓词,让调用者自定义处理逻辑,然后再把最常用的逻辑基于该方法复写一下,拓展性Max!代码如下:

 public static List<File> listFilesInDirWithFilter(File file, Predicate<String> predicate) throws IOException {  if (!file.exists()) {    throw new IOException("File is not exist.");      }   List<File> fileList = new ArrayList<>();  if (file.isDirectory()) {   File[] files = file.listFiles();   for (File f : Objects.requireNonNull(files)) {    fileList.addAll(listFilesInDirWithFilter(f, predicate));          }  } else {   if (predicate.test(file.getName())) {    fileList.add(file);   }  }  return fileList; }

类似的还比如说处理 IO,直接上代码:

public static void readLine(BufferedReader br, Consumer<String> handle, boolean close) {     String s;     try {         while (((s = br.readLine()) != null)) {             handle.accept(s);         }     } catch (IOException e) {         e.printStackTrace();     } finally {         if (close && br != null) {             try {                 br.close();             } catch (IOException e) {                 e.printStackTrace();             }         }     }

方法说你到底想干嘛?!算了,你想干嘛就干嘛吧,请随意?~

重载:写的更多也是为了写的更少

写的更多也是为了写的更少,这句话乍一听感觉非常矛盾,但是编程经验比较丰富的小伙伴应该能体会到方法重载的威力,尤其是在写工具类或者底层接口的时候,建议大家先写一个大而全的内部方法,然后一点点去根据需要重载它,会有意想不到的好处。

最简单的例子,如下:

// Root 方法 private static void readLine(BufferedReader br, Consumer<String> handle, boolean close) {     String s;     try {         while (((s = br.readLine()) != null)) {             handle.accept(s);         }     } catch (IOException e) {         e.printStackTrace();     } finally {         if (close && br != null) {             try {                 br.close();             } catch (IOException e) {                 e.printStackTrace();             }         }     } }  // 重载方法一 public static void readLine(String path, Consumer<String> handle, boolean close) {     try {         BufferedReader br = new BufferedReader(new FileReader(path));         readLine(br, handle, close);     } catch (FileNotFoundException e) {         e.printStackTrace();     } }  // 重载方法二 public static void readLine(String path, Consumer<String> handle) {  readLine(path, handle, true); }

重载可以让我们的方法调用方式变得丰富多彩,在语义明确的情况下,写代码有如神助,配合函数式编程,可以让工具类或者底层接口的能力大大增强。

同时,当我们需要调整某一个方法逻辑时,也可以使用继续重载的方式,将影响面降到最小,尽量不动其他模块的代码。

终极:从设计模式到抽象

与其说是如何写最少的代码,不如说是:如何只写真正有价值的代码。

面对这种问题的时候,我们第一反应肯定就是设计模式了,例如上文的泛型章节提到的模板方法模式,小小的推荐一下我之前的文章:

  • 【一起学系列】之模板方法:写SSO我只要5分钟

  • 设计模式总篇:从为什么需要原则到实际落地

通过良好的设计模式或者其变形体,我们可以得到高内聚低耦合的代码,这是一个非常好的思路。

另一个思路,所有人都认同一点:程序 = 算法 +  数据结构,选择好正确的数据结构可以事倍功半,比如说我们做类似文件夹需求的时候,会想到使用链表或者树结构,在做如:如何高效的给用户发送生日短信时会想到用堆结构(用当前时间对比堆中的最大值,满足则继续迭代,减少遍历)等等。

这其实都是抽象,或深或浅而已,我最开始学习Java的时候,老师会说一句话:万物皆为对象,我们来看看上面的技巧各自对应着什么?

  • 多返回值:封装对象 + 泛型约束

  • 泛型:封装对象的公共接口,高度抽象

  • 函数式方法:把方法当作一个对象

  • 重载:对象方法(行为)的不断演化

“怎么写最少的代码”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么写最少的代码

本文链接: https://www.lsjlt.com/news/281598.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么写最少的代码
    本篇内容介绍了“怎么写最少的代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java:我想返回多个返回值秀一下Go的多返回值:packag...
    99+
    2023-06-15
  • 怎么用最少的JS代码写出贪吃蛇游戏
    这篇文章给大家分享的是有关怎么用最少的JS代码写出贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:完整脚本代码:<!doctype html>...
    99+
    2024-04-02
  • 怎么写好的Python代码
    本篇内容介绍了“怎么写好的Python代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!所谓 pythonic,我觉得包含两方面:一是代码的...
    99+
    2023-06-02
  • golang怎么写代码
    作为一门相对年轻的编程语言,Golang受到了越来越多的关注和青睐,尤其在后端开发领域中备受欢迎。本文将介绍Golang的基础语法和常用的编程范式,帮助初学者快速入门。一、基础语法变量声明变量有多种方式,可以使用var关键字,也可以使用:=...
    99+
    2023-05-15
  • Python代码怎么写
    本篇内容介绍了“Python代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、类有两个方法,一个是 new,一个是 init,有什...
    99+
    2023-06-22
  • oracle怎么写代码
    oracle 数据库代码编写遵循五个关键步骤:选择编程语言(pl/sql、java 或 sql)连接到数据库编写 pl/sql 代码(存储过程、函数、触发器、包)使用 sql 语句与数据...
    99+
    2024-04-18
    oracle sql语句
  • css代码怎么写
    css 编写方法包括:语法选择器选择 html 元素,设置属性和值,形成 css 声明。组织形式有样式表、样式块和内联样式。选择器类型包括元素、类、id 和通配符选择器。常见属性示例有颜...
    99+
    2024-04-06
    css
  • css中小写变大写的代码怎么写
    这篇文章将为大家详细讲解有关css中小写变大写的代码怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在css中,小写变大写的代码是“te...
    99+
    2024-04-02
  • html5的首行代码怎么写
    今天小编给大家分享一下html5的首行代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
  • pycharm怎么编写代码
    如何使用 pycharm 编写代码?创建新项目并文件,在代码编辑器中编写代码。使用代码提示和自动完成功能,提高编写效率。通过运行代码验证其功能。设置断点并使用调试工具进行代码调试。集成版...
    99+
    2024-04-18
    linux python git pycharm
  • html文档的代码怎么写
    编写 html 文档需要遵循八个步骤:创建文档结构添加 html 声明创建 head 元素添加 title 元素创建 body 元素添加元素和属性添加内容关闭元素和文档 HTML 文档...
    99+
    2024-04-21
  • Java NIO代码怎么写
    这篇文章主要讲解了“Java NIO代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO代码怎么写”吧!Java代码:import java.io.IOExce...
    99+
    2023-06-17
  • Java堆代码怎么写
    这篇文章主要介绍了Java堆代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java堆代码怎么写文章都会有所收获,下面我们一起来看看吧。1、堆的定义①、它是完全二叉树,除了树的最后一层节点不需要是满的,...
    99+
    2023-06-28
  • JavaScript的Web Worker代码怎么写
    这篇文章主要介绍“JavaScript的Web Worker代码怎么写”,在日常操作中,相信很多人在JavaScript的Web Worker代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • pycharm写的代码怎么运行
    要如何在 pycharm 中运行代码:通过“运行/调试配置”菜单指定要运行的脚本并单击“运行”。使用键盘快捷键 ctrl + shift + f10 (windows/linux) 或 ...
    99+
    2024-04-18
    linux python macos pycharm
  • java验证码代码怎么写
    以下是一个简单的Java验证码生成代码示例:```javaimport java.util.Random;public class ...
    99+
    2023-08-09
    java
  • html验证码代码怎么写
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-16
  • 怎么把C++的源代码改写成C代码
    本篇内容主要讲解“怎么把C++的源代码改写成C代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么把C++的源代码改写成C代码”吧!C++解释器比C语言解释器占用的存储空间要大,想要在某些特定...
    99+
    2023-06-16
  • redis读写分离代码怎么写
    使用 redis 实现读写分离代码,通过连接写服务器和多个读服务器来实现:1. 写操作使用写服务器客户端进行;2. 读操作使用读服务器客户端进行;3. 确保数据一致性需要定期同步写服务器...
    99+
    2024-04-08
    python redis
  • MySQL查看锁的代码怎么写
    本文小编为大家详细介绍“MySQL查看锁的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL查看锁的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MySQL查看锁的sql查看数据库状态...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作