编程杂感两篇

2023-11-20

(一)

Null是个巨大的错误吗?

为null正名。

null可以表示未初始化的引用。为什么不强迫初始化,因为初始化时可能抛异常。变量声明放进try块,又可能有跨作用域的需求。一种常见的做法是大改语法引入maybe关键字支持代数类型,并且函数做模式匹配,否则难以完美处理这个问题。另外,每个处理meybe类型变量的函数,无非强制写两个分支分别处理nothing和just,本质就是强迫程序员分别处理null变量和已初始化变量,虽然好处是从文法上保证程序的正确性。但是实践中识别null变量也可以留给程序检查或者IDE插件来实现,而大部分IDE也已经做到了。
null也可以用来表示空的返回值。同样,调用者要处理null或non-null返回值。如果文档明确提醒使用者有可能会返回null值,实践中是可行的,这也是惯例。返回一个maybe类型未尝不可,但是在面向对象编程实践中,这又增加了抽象的层次(比如协变的概念,假如要利用返回对象的虚函数),增加了开发者的脑力负担。

所以说,null还是有好处的。尤其在IDE的帮助下,降低了开发的难度。

(二)

Java与C++编程效率。

Java借力软件工程,C++重视与计算机底层的结合。

面向对象的软件设计方法,第一件事是建模,把现实抽象为若干个类,定义若干接口。C++软件的设计,从现实抽象建模的同时,手动管理对象生命周期,容器、工厂类设计好,谁创建对象,谁负责对象的销毁,谁只是持有指针,对象析构同时释放资源,这些都要考虑。同时也要考虑计算机底层的内存分配,甚至要考虑CPU cache、分支预测、IO效率等。所以C++要设计好,需要考虑更多底层实现。

但是,Java的虚拟机,帮你解决了大部分底层问题,比如GC。你只需关注在抽象层,设计好容器、工厂、事件,对象生命周期问题JVM帮你解决。同时,Java有反射和注解,更方便对象的管理,软件工程上带来IOC、AOP思想,造就了各种框架。于是更有利于解耦,把应用开发变成了模板填空。降低了每个人的心智负担,便于分工协作,自然提高效率,降低开发难度。应用开发的最省力方式就是,拖控件,填模板。

以上所说只是单纯对比开发相同大小的两个小程序,而不牵涉后台的数据库、并发、缓存这些架构问题。而这些更是Java的强项,强大的开源生态,跨平台的开箱即用,也大大提高了开发效率。

原为某问答网站上两个回答,现收藏入blog,note之。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程杂感两篇 的相关文章

随机推荐

  • Java中的List接口

    文章目录 前言 一 什么是List 二 List常见接口介绍 三 List的使用 总结 前言 以实践为线索 逐步深入数据结构和算法 提升编程能力和思维能力 一 什么是List 在集合框架中 List是一个接口 继承自Collection C
  • git 新添加一个项目

    如何将一个新的项目放到制定的git地址上 1 创建一个项目 2 在githup上添加一个仓库 3 在命令行模式下 在指定的目录下 git init 此处需要修改一下ignore文件 git remote add origin https g
  • jvm之栈、堆

    1 Java Virtual Machine 人群当中 一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌 就在此时 c老头和c 老头缓步走来 看着被众人围住的java c老头感叹地对着身旁的c 说道 原以为你就可以挑起我的梁
  • 反斜杠“\”与斜杠“/” 的区别

    与 的区别为 用途不同 系统不同 网址不同 一 用途不同 1 只能用来表示目录 2 技能作为除法符号或者间隔符号使用 也能用来表示目录 二 系统不同 1 用作目录时 适用于windows系统 2 用作目录时 适用于unix系统 也可用于wi
  • Kali安装配置中的一些小细节

    整理文档时 找到了一年前的一些文档 零零散散 在其中看到了一篇在初学kali时写的注意点 我根据更新做了一些修改 都适用于kali最新版 希望能帮助一些自学 初学者比当年的我更快弄懂 Ubuntu系统学习 主机名 kali name rid
  • Tcl-10. 字符串比较,匹配,替换,类别,映射,string 相关

    一 字符串比较 string compare string equal 我们在 expr 和控制语句如 if while 中可用比较运算符 等来进行字符串比较 但是如不注意的话就会产生问题 首先必须用双引号来将字符串值括起来 这样表达式语法
  • ant-design-vue 全局和局部引入组件

    1 全局引入 在main js里面引入 import Vue from vue import ant design vue dist antd css import Antd from ant design vue Vue use Antd
  • FPGA功耗估计(二)

    针对于Altera的Cyclone III 做出了静态功耗 对于Altera 其提供了一个功耗早期估计工具 可以在官网上下到 首先需要将宏设置为安全 在excel选型中选择文件 之后便可看到 根据相应的选择 红框部分 可以查看静态功耗 对于
  • Error:(3, 32) java: 程序包org.springframework.boot不存在

    1 Error 3 32 java 程序包org springframework boot不存在 近期使用IDEA2020 1版本创建springboot项目的时候 运行主启动类后 突然就报错 错误如下 找了很多解决办法 刷新了很多遍Mav
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • RT-Thread记录(七、IPC机制之邮箱、消息队列)

    讲完了线程同步的机制 我们要开始线程通讯的学习 线程通讯中的邮箱消息队列也属于 RT Thread 的IPC机制 目录 前言 一 邮箱 1 1 邮箱控制块 1 2 邮箱操作 1 2 1 创建和删除 1 2 2 初始化和脱离 1 2 3 发送
  • 骑马与砍杀服务器修复,《骑马与砍杀2》新热修补丁:联机社交系统更新、修复单机崩溃...

    目前 骑马与砍杀中文站官博公开了 骑马与砍杀2 7月1日Beta e1 4 1测试版公共版热修补丁 此次热修补丁会更新联机社交系统 同时还会修复单机崩溃问题 以下为官方原文 官博截图 公共版 版本 Native e1 4 1 Sandbox
  • qt 获取父类指针

    QWidget QWidget parentWidget const Returns the parent of this widget or 0 if it does not have any parent widget
  • 单向散列函数的性质

    一 根据任意长度计算出固定长度的散列值 首先 单向散列函数的输入必须能够是任意长度的消息 其次 无论输入多长的消息 单向散列函数必须都能够生成长度很短的散列值 如果消息越长生成的散列值越长的话就不好用了 从使用方便的角度 散列值的长度最好是
  • 运行Chrome中的app

    chrome apps
  • python中and与or的计算规则

    1 在纯and语句中 如果每一个表达式都不是假的话 那么返回最后一个 因为需要一直匹配直到最后一个 如果有一个是假 那么返回假 2 在纯or语句中 只要有一个表达式不是假的话 那么就返回这个表达式的值 只有所有都是假 才返回假 3 在or和
  • git 报错did not match any file(s) known to git

    前言 在使用gitLab中时遇到一个问题 就是我在gitLab新建分支后 在本地切换分支不成功 遇到了这个问题 在大佬的博客的指点下 顺利解决这个问题 记录下我一步一步解决问题的过程 最后面是我参考大佬的地址 有兴趣的朋友可以去看一下 问题
  • 使用花生壳将自己的Linux主机配置为服务器

    1 服务端花生壳配置 http service oray com question 11630 html 如果在客户端连接失败 在这里点击诊断 如果局域网服务器连接成功才行 不成功可能的原因有两个 1 配置不对 内网主机要写Linux主机的
  • matlab产生高斯噪声

    randn randn random normal distribution 是一种产生标准 正态分布的 随机数或 矩阵的函数 属于MATLAB函数 返回一个n n的随机项的矩阵 如果n不是个数量 将返回错误信息 MATLAB函数randn
  • 编程杂感两篇

    一 Null是个巨大的错误吗 为null正名 null可以表示未初始化的引用 为什么不强迫初始化 因为初始化时可能抛异常 变量声明放进try块 又可能有跨作用域的需求 一种常见的做法是大改语法引入maybe关键字支持代数类型 并且函数做模式