精华内容
下载资源
问答
  • 优秀的程序员真的不写注释吗?

    万次阅读 多人点赞 2020-05-11 07:02:23
    有些大牛也有孟子这样的觉悟,如果有人要他给自己的代码加上注释,就好像是对他的一种侮辱:“我的代码得这么优雅,你难道看懂吗?注释是多余的!” 我必须得承认,每个程序员都应该有一颗追求“优雅”的心,...

    我在很多地方看到这样一个观点,“请停止写注释,因为只有烂的代码才需要注释。”这个观点非常巧妙,它让我想起了孟子的一句话,“杨氏为我,是无君也;墨氏兼爱,是无父也。无父无君,是禽兽也。”

    动不动就骂别人是“禽兽”,我总觉得有点不妥,这很不符合孟子的浩然之气啊。有些大牛也有孟子这样的觉悟,如果有人要他给自己的代码加上注释,就好像是对他的一种侮辱:“我的代码写得这么优雅,你难道看不懂吗?注释是多余的!”

    我必须得承认,每个程序员都应该有一颗追求“优雅”的心,力争自己的代码更易阅读和理解——不只是针对机器,还有我们程序员同行。但不是每个程序员在一开始都能写出“高标准”的代码的,就好像不是所有君王和百姓都能搞清楚孟子的治国齐家理念的。

    在我刚回洛阳的那段时间,过得非常痛苦。因为我刚接手了别人留下的一个项目,关于大宗期货交易的。后端代码是用 Java 写的,但有很多 bug 在里面,动不动就资金结算失败,甚至内存溢出,要解决这些问题,只有一个办法,就是彻底搞懂这些代码。

    否则,根本无从下手。这就好像,你和朋友开车出去自驾游,去很远很远的地方,朋友开累了,需要休息,这时候,如果你没考过驾照,那就抓瞎了,只能把车停路边,等朋友的疲劳消退了,才能继续上路。

    我就抓瞎了。凭良心说,前同事留下的代码是精彩绝伦的,如果换做是我来写,真不一定能写得出来。毕竟大宗期货交易本身还是有点难度的,需要竞价撮合,这个业务理解起来比股票还要复杂些。

    股票涨了就赚,跌了就亏。期货不同的,买涨能赚,买跌也能赚。不过业务上的复杂还是次要的,重要的是代码里的注释非常稀有,就好像詹姆斯高斯林头上的发丝一样稀有。

    况且,国内程序员的英语功底你懂的,变量、方法、类、接口、枚举的命名无法做到真正意义上的名如其意。再加上,有些方法的行数多达三四百行,从头看到尾,看得只想捶自己。

    没办法,我的解决办法就是,看懂一行就加一行注释,毕竟注释总比代码要容易理解啊。就好像,我们在调用一个不熟悉的 API 时,只要代码的文档说清楚它是干嘛的,我们就可以用,就敢用,至于实现的细节,暂时没有理解也没关系。

    差不多花了两个月的时间(非常漫长、非常煎熬)吧,我总算是把项目中核心的代码给研究清楚了。搞清楚之后,那些之前怎么改都改不掉的 bug 也就迎刃而解了。

    这也就是为什么,我倡导大家去读源码的一部分原因了,除了学习,读源码是解决 bug 的杀手锏。要读懂源码,注释是必不可少的。不信,你看看 Java 的源码,每个变量、每个方法、每个类,注释都非常详细,详细到你替源码的作者感到心累。

    在我看来,Java 源码的作者绝对是这个世界上最优秀的程序员,连他们都写注释,那些声称“请停止写注释”的号召者是不是要啪啪啪地打脸,直到打肿为止。

    不要怀疑自己,写注释并不会证明你的代码就是烂代码。我相信,你应该买过电子产品,比如说鼠标、键盘、耳机、手机等等,所有的产品包装里除了产品本身,使用说明书是必不可少的。我就问一句,“手机没有使用说明书,咱这些后浪还能不会用?”

    写注释不是我们的错,软件本来就是复杂的。尤其是我们这些英语不是主力语言的人来说,注释显得尤为重要。我可能属于记忆力不好的那一种,隔个十天半个月,再去回头看那些我自己敲的代码,有时候真有点见着陌生人的感觉:“这代码是我写的吗?怎么有点面生啊?”

    大部分人写的代码都要升级重构,对吧?不论是语言本身版本的升级,还是我们自身能力的成长。假如在升级重构的时候,没有这些注释的帮助,真有点爬泰山的感觉,累啊,亲。

    再者说,大牛也不敢保证自己的代码是没有问题的,对吧?但注释是不会骗人的,它的意义是明确的。你可能会忘记代码是干嘛的,但我敢保证,注释能够唤醒你的记忆。

    写出好的、有意义的注释其实是有难度的,就像写代码一样。在追求卓越的路上,代码和注释其实是相辅相成的。注释会让你的代码更易阅读,代码会让你的注释更富有逻辑。

    即便是你的代码已经优雅到不需要注释,那只是在你的层面上。对于你的同事,你代码后来的负责者,就不一定了。所见略同的英雄并不会很多,你以为很优雅的代码没准在别人眼里就是一坨垃圾,而你的注释很可能会帮助别人“恍然大悟”,明白代码的意义。乖乖地写注释吧,对你对别人都有好处。

    另外,我想说一句,注释就好像是代码的一个蓝图,也或者是对代码的一个总结。在你写代码之前,脑子里肯定要想清楚你要实现什么,怎么实现,把这些作为注释写下来绝对可以帮助你写出更优雅的代码。在代码写完之后,通过注释进行总结,还能对代码进行一些升华,没准还能在总结的过程中想到更好的代码方案。

    我还见到有大牛信誓旦旦地说,写注释就好像是给不会游泳的人扔一个救生圈,他永远也学不会游泳。咋眼一看,这句话说得很有道理,对吧?在大牛们看来,要让一个新人快速成长,最好的办法就是把没有注释的代码扔给他看。

    纯属扯淡,恐怕这个新人没入门就放弃了吧?我已经三十一岁了,不,我已经十八岁了,还不会游泳呢?别听那些大牛们的鬼话,我就不信,他自己没写过注释。

    总之一点,注释并不会妨碍你写出优雅简洁的代码,它只是程序固有的一部分而已

    如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。本文已收录 GitHub,传送门~ ,里面更有大厂面试完整考点,欢迎 Star。

    我是沉默王二,一枚有颜值却靠才华苟且的程序员。关注即可提升学习效率,别忘了三连啊,点赞、收藏、留言,我不挑,嘻嘻

    展开全文
  • 为什么不写parameterType也可以运行成功?因为mybatis能自动识别,但返回值类型不能不写 (idea-mybatis插件也不生成parameterType,刚好,以后推荐不写parameterType) mybatis自动识别入参对象, 传入单个map或单个...

    多在mapper接口写@Param注解, 那么,你在mapper.xml  alt+/会有提示

    为什么不写parameterType也可以运行成功?  因为mybatis能自动识别,但返回值类型不能不写

    (idea-mybatis插件也不生成parameterType,刚好,以后推荐不写parameterType)

    mybatis自动识别入参对象, 传入单个map或单个对象,无需写@Param注解   如@Param("map")  Map<String, Object> map 

    那么什么时候必须在mapper接口上写@Param注解呢,   mapper接口中有多个参数(每个对象或参数都要加@Param注解), 或一个 String, 必须使用@Param注解, 

     

    MyBatis还提供了一个使用注解来参入多个参数的方式。这种方式需要在接口的参数上添加@Param注解

    List<NoticeModel> getRevNoticeList(
    @Param("queryParam") NoticeQueryParam queryParam,
    @Param("getDeptIds") List<String> getDeptIds,
    @Param("getProjectIds") String getProjectIds,
    @Param("map") Map map
    );

    那么, 不写parameterType, 在mapper.xml如何使用

    如果是对象NoticeQueryParam queryParam, 直接在mapper.xml使用   queryParam对象.成员变量

    @Param("map") Map map    map对象.成员变量

    如果是List<String> getDeptIds  直接在mapper.xml 中使用getDeptIds  不需要 对象.成员变量
    如果是String getProjectIds  直接在mapper.xml 中使用getProjectIds   不需要 对象.成员变量

     

    展开全文
  • tableName: 表名 id: 主键(唯一键) field_1: 更新的字段 为空更新 新值大于旧值更新

    tableName: 表名
    id: 主键(唯一键)
    field_1: 更新的字段

    为空更新

    INSERT IGNORE INTO `tableName`(`id`,`field_1`) VALUES('1', '100'),('2', '200') ON DUPLICATE KEY UPDATE field_1 = IF(tableName.field_1, tableName.field_1, VALUES(field_1))
    

    新值大于旧值更新

    INSERT IGNORE INTO `tableName`(`id`,`field_1`) VALUES('1', '100'),('2', '200') ON DUPLICATE KEY UPDATE field_1 = IF(VALUES(field) > tableName.field_1, tableName.field_1, VALUES(field_1))
    
    展开全文
  • 需要.NET 一个事物在更新集合数据(即多条数据)到SQL数据库时其中有一个报错则所有数据都不更新。 方法如下,事物代码我应该怎么 public void UpdateCollection(RequirementsPlanningCollection datas) { ...
  • vue数据不更新的原因(vue中数据更改了,但是视图没有更新) 参考链接 templete: &amp;lt;div id=&quot;app&quot;&amp;gt; &amp;lt;h2&amp;gt;{{dataObj.text}}&amp;lt;/h2&amp;gt;...

    vue数据不更新的原因(vue中数据更改了,但是视图没有更新)

    参考链接

    templete:

    <div id="app">
            <h2>{{dataObj.text}}</h2>
    </div>
    

    js:

    new Vue({
                el: '#app',
                data: {
                    dataObj: {}
                },
                ready: function () {
                    var self = this;
    
                    /**
                     * 异步请求模拟
                     */
                    setTimeout(function () {
                        self.dataObj = {};//真正实现数据更新的是这行代码
                        self.dataObj['text'] = 'new text';
                    }, 3000);
                }
    })
    

    上面的代码非常简单,我们都知道vue中在data里面声明的数据才具有响应式的特性,所以我们一开始在data中声明了一个dataObj空对象,然后在异步请求中执行了两行代码,如下:

    self.dataObj = {};
    self.dataObj['text'] = 'new text';
    

    解决办法: 首先清空原始数据,然后添加一个text属性并赋值。然后数据和模版都更新里。

    其中.text属性不具有响应式,但是数据更新了。原因:

    vue的dom更新是异步的,即当setter操作发生后,指令并不会立马更新,指令的更新操作会有一个延迟,当指令更新真正执行的时候,此时.text属性已经赋值,所以指令更新模板时得到的是新值。
    具体流程如下:

    • self.dataObj = {};发生setter操作
    • vue监测到setter操作,通知相关指令执行更新操作
    • self.dataObj[‘text’] = ‘new text’;赋值语句
    • 指令更新开始执行

    所以真正的触发更新操作是self.dataObj = {};这一句引起的,所以单看上述例子,具有响应式特性的数据只有dataObj这一层,它的子属性是不具备的。

    数组更新检测

    Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

    push()
    pop()
    shift()
    unshift()
    splice()
    sort()
    reverse()
    

    注意事项

    由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

    当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
    当你修改数组的长度时,例如:vm.items.length = newLength
    举个例子:

    var vm = new Vue({
      data: {
        items: ['a', 'b', 'c']
      }
    })
    vm.items[1] = 'x' // 不是响应性的
    vm.items.length = 2 // 不是响应性的
    

    为了解决第一类问题,以下两种方式都可以实现和vm.items[indexOfItem] = newValue相同的效果,同时也将触发状态更新:

    // Vue.set
    Vue.set(vm.items, indexOfItem, newValue)
    
    // Array.prototype.splice
    vm.items.splice(indexOfItem, 1, newValue)
    

    你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:

    vm.$set(vm.items, indexOfItem, newValue)
    

    为了解决第二类问题,你可以使用 splice:

    vm.items.splice(newLength)
    

    对象更改检测注意事项

    还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

    var vm = new Vue({
      data: {
        a: 1
      }
    })
    // `vm.a` 现在是响应式的
    
    vm.b = 2
    // `vm.b` 不是响应式的
    

    对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性。例如,对于:

    var vm = new Vue({
      data: {
        userProfile: {
          name: 'Anika'
        }
      }
    })
    

    你可以添加一个新的 age 属性到嵌套的 userProfile 对象:

    Vue.set(vm.userProfile, 'age', 27)
    

    你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:

    vm.$set(vm.userProfile, 'age', 27)
    

    有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

    Object.assign(vm.userProfile, {
      age: 27,
      favoriteColor: 'Vue Green'
    })
    

    你应该这样做:

    vm.userProfile = Object.assign({}, vm.userProfile, {
      age: 27,
      favoriteColor: 'Vue Green'
    })
    
    展开全文
  • Java @Override注解 写与不写的区别

    千次阅读 2018-08-23 15:49:15
    一般来说,写与不写没什么区别,JVM可以自识别 写的情况下:即说明子类要覆盖基类的方法,基类必须存在方法 (控制类型public,protected,返回值,参数列表类型)与子类方法完成一致的方法,否则会报错(找不到被...
  • react路由更新 页面不更新

    万次阅读 2020-12-14 19:24:09
    把路由文件的默认页面放在最下面就可以解决问题了 <Router> <div className="App"> <Switch> <Route path="/About" component={About}></Route> <R
  • Windows聚焦壁纸不更新的最佳解决方法

    万次阅读 多人点赞 2019-09-17 16:16:32
    相信很多人都有这样的困惑,系统打完补丁更新后或其它情况导致了锁屏界面的“Windows聚焦”可用,即不更新壁纸,每次锁屏都一个样,造成特别大的审美疲劳。按常理那就是百度看看咯。基本有以下几种方法: 1. 删...
  • 如何让Win10电脑不更新

    万次阅读 2020-06-18 16:07:17
    Win10电脑更新是件比较讨厌的事儿,有时候要等好久。 方法/步骤 1 首先按下 Win+R,输入services.msc ... 打开任务栏设置,搜索检查更新 ... 找到进入高级选项,找到暂停更新,设置暂停更新时间(.
  • jpa中为null不更新实现的几种方式

    千次阅读 2019-07-22 20:40:42
    jpa中为null不更新实现的几种方式 ps : 以下几种是StackOverflow等收集过来的方法,但是测试还是有问题(没有全部测试过,有空处理) BeanUtils的使用 目前BeanUtils还没有支持为空则进行拷贝,但是有一个方法...
  • Vue数据发生变化,视图层不更新

    千次阅读 2018-06-22 09:38:26
    先是在数据中添加了一个字段,结果发现每次更改字段值,值发生变化,但是视图层却不更新this.AllRoleList.forEach(function(item,index){ item["check"]=false })其实发现这样不会被监听到 应该使用...
  • zabbix仪表盘图形数据不更新

    千次阅读 2018-05-16 10:35:48
    问题:zabbix仪表盘图形时间卡在某个时间点不更新,图形模块的图形没有问题。解决方案:网页查看元素,找到图形的herf,修改stime为当前时间,单独访问此链接,刷新zabbix主页,图形数据开始更新。原因:可能是因为...
  • 2.好一封工作邮件,重要的不是“怎么”,而是“什么该,什么”。 3.重要的备忘、通知和需要留底的话,最好通过工作邮件传递。 I、如何做到位极人臣?(奏章和来往批复的文件得好) 回到古代,司马光跟...
  • 很多朋友在配置微端后补丁还是无法更新,让我帮看一下,今天我给大家总结了几点微端配置后不更新的原因和解决方法,供各位朋友参考 1、检查微端网关的IP和端口是否和列表上的一致,一致需要改为一致的 2、检查...
  • Mybatis中的resultType的路径可以不写

    千次阅读 2019-04-27 12:15:09
    可以不写全的原因是因为设置了别名包; 设置的是你的实体类的包的位置 然后就可以写了
  • 在一个组件实例中,只有在data里初始化的数据才是响应的,Vue能检测到对象属性的添加或删除,没有在data里声明的属性不是响应的。 Vue允许在已经创建的实例上动态添加根级响应式属性,但是可以使用$set方法将...
  • 1.问题描述:在echarts弹框中嵌入echarts,在页面数据改变时,echarts视图不更新; 2.解决办法: 数据更新时以为drawLine()函数在updated()里面执行(这种情况之前碰到过),后来发现热更新之后视图更新了,所以跟...
  • element table 改变数据列表不更新

    万次阅读 2019-09-05 10:54:26
    解决办法,使用 $set 重新给 data 赋值,原因尚清楚(神烦啊,这什么双向绑定啊,唉,新手入坑第一弹) <el-table :data="data" stripe border> <el-table-column label="操作" width="200px"> &...
  • 这是敏捷开发智慧敏捷的第二篇。(之一,之二,之三,之四,之五,之六) 缘起“我们产品已经做完了,客户说...不写,怎么不写?为什么敏捷不写文档?先把话说绝点,敏捷就是不写文档。那为什么不写文档?为了减少浪费
  • 我在工作中发现,路由本身有query参数,但是我点击更新了query,也push了,页面url改变,这个时候其实用到了对象的拷贝,你需要对query对象做拷贝,对象的拷贝方法如... 代码如下,我才用的对象变字符串再变对象拷贝...
  • ProgressBar setProgress()方法 不更新进度 项目中有个需求就是定时刷新一个进度条的操作,用了ScheduledThreadPoolExecutor 的scheduleAtFixedRate()方法定时调度,但是每次返回数据之后 进度条也都是没动的。...
  • java实体类不写get/set方法

    万次阅读 2018-02-27 14:41:19
    java实体类不写get/set方法1、下载地址https://projectlombok.org/downloadMyeclipse、eclipse安装lombokLombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网:...下载lombok.jar包 2....
  • 之前Spring MVC项目的时候完全没有这样的问题,经过一阵摸索和百度,最后解决了这个问题,目前百度谷歌到的答案其实都完整(甚至压根就是错的)   先说第一个问题: 更新html,css,js文件以后,为啥Update classes ...
  • 按键精灵 官方废了 , 不更新

    千次阅读 2017-08-31 09:50:00
    临时笔记抓包F12,或者httpwatch{按键官网基础教程网址:http://zy.anjian.com/videomanual/index.htmlhttp://www.aipai.com/c9/ODY9JSYmIGgnaiAr.html网页按键精灵 wqm 文档 被官网禁用了WQM 不更新了...
  • vue中数据改变 界面不更新问题

    万次阅读 2019-07-23 11:03:54
    vue双向绑定问题中,能实现及时更新的问题: 在data中显式声明的对象能及时更新 在form中,经过v-model的变量 或 在其他html标签中 使用v-bind:方法的变量才能及时更新 vue能检测到对象属性的增加,修改...
  • Eclipse Web项目更新JS,页面不更新

    千次阅读 2018-07-24 08:31:49
    今天Web项目时,更新了js,发现页面没更新,F5了半天也没反应,重启了项目也不行。 就百度查了下。 在页面按shift+F5强制更新就好了
  • 子cell又是使用template(scope)渲染的,当循环数据更新(push,splice,或者重新赋值)时,可能出现子cell不变的情况,从而导致页面元素和循环数据对上的报错问题猜测:可能是template中的scope没有变化导致不更新,...
  • 今天上去看了下namenode的fsimage镜像好久没从内存到硬盘上了,想找找什么问题。对hadoop也太熟悉,也是慢慢摸索阶段 启动SecondaryNameNode 启动命令 hadoop-daemon.sh start secondarynamenode 然后执行jps...
  • AngularJS中ng-repeat不更新视图的问题的可能解决方案
  • 如果一个类的成员没有任何权限修饰,那么它门就是缺省包访问...就可以。对于同一个文件夹下的、没有用package的classes,Java会自动将这些classes初见为隶属于该目录 的default package,可以相互调用class中的frie

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,526,702
精华内容 4,610,681
关键字:

不写了