打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
停滞不前的不是java,是顽固的java程序员。

最近学习sicp,对产生对象不用保存变量的优雅方式印象非常深刻。
下面的代码刻意没采用lisp写,以便大家阅读。
make(name, age) {
return {
get_name() {
return name
}
get_age() {
return age
}
}
}
说明:
1、make函数根据姓名及年龄返回一个东西。
2、这个东西可以用get_name取名字,用get_age取年龄。
3、程序中用return返回了这个东西,他包含两个函数,get_name与get_age。
4、get_name与get_age直接返回make传过来的参数,不用保存到变量里。
这种做法java可以吗?还真可以。
在java里,你得先做个接口,包含get_nam e与get_age方法,假如接口名为IS。然后写类。
class S {
static IS make(name, age) {
return new IS({
get_name() {
return name
}
get_age() {
return age
}
})
}
}
为了书写方便,上述代码表达出了实际意义,忽虑了部分语法结构。
说明:
1、先做一个接口。
2、把类当模块用,静态方法make当函数用。
3、make函数里返回一个匿名内部类,实现get_name,get_age函数。
4、get_name,get_age直接取make函数的参数返回,不用保存变量。
java也可以做到按函数式方式产生对象。不仅如此,只要肯思考,Haskell中各种优雅的编码方式,java也能做。
关键在于java程序员们,不能死守java的老传统。要跳出java,学习新思想,然后在java中应用。
这样,你会发现一片不一样的天地。



附带说明,本人93年毕业,目前还不顽固。顽固与年龄无关,与学习能力有关。

很多培训班刚毕业的,年纪轻轻,就已经很顽固,顽固到认为程序就是spring全家桶。

所以你这样写提高了生产力,还是提高了程序稳定性,还是提高了程序性能,还是语言本身有重大提升[我想静静]

提升稳定性,不存变量。减少变量错误改变引发问题。


A:先看下spring 框架,然后试着实现一下他的依赖注入。看看你这种写法会不会让你自己崩溃

A:考虑循环依赖。多种注入方式。各种加载方式

A:如果是简单业务,语法多写一两行没啥区别。复杂业务如果没有面向对象的支持,你写不出来。中间会崩。这就是为啥面向对象会被设计出来。为啥现在几个大的前端框架都用ts重构?不就是因为js太灵活了。不如ts吗。

B:1.楼主的写法,和js与ts完全两回事。ts只是给js这种动态类型加上静态类型而已,js支持的编程范式ts都支持。而且ts是结构类型语言(部分场景下也具备名义类型),这样的目的就是面向函数编程,与java那种名义类型语言也有很大区别。js项目改为ts,只是为了让编译器帮人做点事。和那些静态语言分析工具差不多。2. 题主的写法没问题,只要使用得当,能大幅度增加效率,说人家没入门太不应该了。

A:嗯,我没入门之前跟你想法一样。

A:我也没说一回事啊。语法本来就是末流的。编程最简单的就是输入代码。考虑代码是否简洁。就像是画画每天研究画笔是否漂亮,设计大楼每天研究混凝土的包装袋是否干净一样,重点完全搞错了。

A:ts的目的是面向对象编程


C:java也可以通过匿名函数去写这个闭包,只是根节点一定要是类,这是这门语言设计之处定下的哲学,不然用其他语言就好了。另外你这个闭包,要怎么继承?例如makeWoman怎么写?

D:不用继承,用组合。组合代替继承。

C:那大概跟javascript不走prototype的做法一样。只是真正代码写下来,那个关联关系大概不是那么显式。

D:关联关系不影响,继承关系没有了。我也是过了很久才接受了不要继承,用组合的想法。go语言、rust语言都把继承去掉了。业绩很早就有人在强调不要使用继承了,开始我不理解,但我不会抵制,改过来后,发现好多了。

C:组合可以,我意思是这种闭包的方式,没办法显性地标注组合关系。例如go里A组合B,是需要显性引用结构名的。

E:显性标注确实做不到,不过这种做法,本身就是想屏蔽内部结构。其实这个做法,最大问题是有多个造函数时,return的对象部分代码会重复。


闭包函数难道不是对象?

是对象,但是没存变量,可以减少错误。

未见得,这样,反而不容易阅读

只是显式无变量而已。

对,这样可以防止程序员不小心修改变量,或者忘了修改变量。减少变量使用,程序可靠性会提高很多。

闭包而已,无非是提供初始化接口,不提供更新接口


Java语法比较繁琐,虽然近几年在努力改进,但还是不如scala,kotlin这些基于jvm的后起之秀。文中这样写自己玩玩可以,如果是团队开发,这种写法显然不好。真想要追求语法简洁优雅,干脆直接用scala,kotlin好了

这样写不存变量是关键,减少变量引发的问题。

但是带来很多坏处


JavaScript一直都能这么搞,很灵活是吧,但真有你说的那么好,后面微软也不会专门整了个TypeScript来应对大型项目了。动态类型爽是爽了,调用方可不爽,创建方删了个函数,调用方在编辑阶段是无感的,运行时才会报错。静态类型改了成员构造,调用方不用运行(除开用反射)就知道哪里被改了。静态类型的严谨被你说得一文不值。

赞同一部分看法,ts确实是为了弥补js的类型系统,为了更好的静态分析,但是动态能力并没有因此丧失。

是的,毕竟超集。


Java代码量确实大,不过我觉得最要的是,中大型项目中,开发效率能提升多少。练习类的项目十来个类,几千行代码的规模,代码多点少点其实区别不大。

是减少变量,消除bug出现的机会,不在于减少代码量。

在中大型商业项目中,bug的原因通常在于对业务不够理解,分支条件考虑不全,常规的数据检查和校验不全不严谨,不在于多几个变量,除非是纯菜鸟。所以我觉得效率、可维护性更重要。


(以下为一条长评论)

码农呢…最不应该的就是沉浸在语法糖里…犹如小女孩儿过家家… 形式语言,最不缺的就是表示法…

Haskell现在是我大约50%的工作语言…我个人觉得我还是理解fp的…但你要说它优雅…你大约就是拿它写了几个递归算法。你要是拿它干点儿正事儿,你就知道了…json serializing时候 tuple不行,必须是list… 很多类型推断需要对左值的类型进行人工设置,这时候出了错,你完全看不明白报的什么意思。最坑是Haskell怎么debug。每种形式语言,都有强项。但弱项也一定明显。没什么可说的。

至于你鼓吹这个写法…不是kotlin还是scala的写法吗?这么写营养在哪?不保存private变了,内存的cost仍然要给,该不可重入,仍然不可。

说别人顽固,其实只是自己刚学会用锤子,看什么都像钉子罢了。


这是用别的语言的思想写java。下次把代码调试下再发出来,参数没有类型,方法没有返回值,匿名类方法体写括号里。

说过了,简写,代表思想就行。


new 这个关键字麻烦你解释下,IS具体实现是啥麻烦说明下

简写,代表思想而已。


匿名类而已 编译器隐藏掉了 该有的mov指令一个都不会少


兄弟,你要带入历史发展(时间)和管理模式的角度来看这个问题。比如go、rust、js,python都是社区驱动的,会考虑开发人员敲代码的效率,好友性等等。

不同语言可以互相借鉴,好的思想理论用什么语言都能实现。java8向函数式编程学了不少内容。


出了问题你都找不到解决方案,最后全部重构[抠鼻]

这样做,会减少问题,因为没存变量。


那麻烦讲一下,匿名内部类的过程实现


你用它写写大型项目就知道了,需要只是工具,什么合适用什么


搞java的还有不知道这内部类的写法?java现在没落不是做不到的问题是做一件事很繁琐的问题


就是以前的匿名类,现在就是lambda了

你说的对,还有流。流是典型的引入函数式思路。


了解下面向对象处理了什么问题,以及为什么有用,考虑下如果不用,会有什么问题。


自己爽了,别人不知道怎么维护[奸笑]很多优雅的东西确实很优雅,看起来简洁得一匹,可惜出问题你都不知道怎么查[大笑]


一个实体对象几十个属性,那准备咋写?

小打小闹可以,项目大了这种做法就是灾难

生产环境讲的是稳定,谁好用用谁,生态不完善的在复杂系统里能把人搞死


优雅在什么地方?

在不用保存变量。

内存共享怎么办??

尽量不要共享,用不变性。



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
为什么“无人问津”的Lisp可以这么狂?
这样理解面向对象,你就站在了巨人的肩上
王垠:如何掌握程序语言
Java类变量和成员变量初始化过程
我的最小项目管理工具集
Android JNI编程提高篇之一
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服