关于设计模式
java的23种设计模式? 再见.
不是说他们没有作用,只是说它们太死板复杂,学习它们通常入不敷出。
对于编程还有很多需要注意的地方(下文),而不要只局限于设计模式。
我给出的建议是只需要理解一个大概,在平时编程中能用则用。
关于面向对象
如何使用Golang进行无心智负担的编程
Golang相比Java来说, 对"面向对象"这件事的支持是"不完整"的.
但话又说回来现在的"面向对象编程"渐渐被扭曲为了"面向类编程"(COP),而COP是复杂并难以理解的,COP有好处但要发挥出来并不容易。所以Golang决定抛弃所有不必要的概念以改善这个问题。
现在不必再理解 封装(这个简单到不需要理解), 多态, 继承.
在golang中只需要理解两个更实在的东西: 接口, 组合.
接口
Java 之父 James Gosling 在某次会议上有过这样一次问答:
I once attended a Java user group meeting where James Gosling (Java’s inventor) was the featured speaker.
During the memorable Q&A session, someone asked him: “If you could do Java over again, what would you change?”
“I’d leave out classes,” he replied. After the laughter died down, he explained that the real problem wasn’t classes per se, but rather implementation inheritance (the extends relationship). Interface inheritance (the implements relationship) is preferable. You should avoid implementation inheritance whenever possible.
大意是:
问:如果你重新做 Java,有什么是你想改变的?
答:我会把类(class)丢掉。真正的问题不在于类本身,而在于基于实现的继承(the extends relationship)。基于接口的继承(the implements relationship)是更好的选择,你应该在任何可能的时候避免使用实现继承。
---- 摘自 Golang OOP、继承、组合、接口 https://studygolang.com/articles/20972
在Golang中只需要记得一个东西: Interface(接口).
参见io.Reader接口就知道这种设计有多厉害.
读文件是它, 读网络请求也是它, 更骚的是 对于linux(Every thing is a file)来说用它就能操作近乎整个系统了.
简单的说: 当某个功能(如去北京)有多种(或者以后可能有多种)实现方式(如坐火车/飞机/骑车)的时候, 用接口.
组合
组合理解起来并不复杂, 不过是一个语法糖, 就算没有组合功能也毫不影响Go程序的运行.
如下代码, 没有组合换一种写法即可.
// 组合
type L struct {
sync.Mutex
}
// 这样使用
L.Lock()
// 没有组合
type L struct{
l sync.Locker
}
// 这样使用
L.l.Lock()
简单的说: 组合能用则用,如果你不知道如何使用或者不用也并无大碍。
关于可维护性
如何使用Golang进行无心智负担的编程
"开闭原则"对我启发很大.
原文是这样:
伯特兰·迈耶一般被认为是最早提出开闭原则这一术语的人,在他1988年发行的《面向对象软件构造》中给出。这一想法认为一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。
但其实我们在开发的时候并不是一直都在和对象打交道.
在我看来, "开闭原则"适用于平时写的任何代码.
完整理解"开闭原则"可能还是会造成心智负担, 所以先打住, 只需要这样:
一个函数只做一个功能(事情), 一旦这个功能开发完成, 这个函数应当"闭合", 不应该再修改(bug除外).
当需要修改功能, 应当尽量将修改也写成一个函数,尽早的进入分支判断去调用新修改,而原代码不变。
这便是 "对修改闭合, 对扩展开放".
这里不得不在提及"面向函数编程", 它的思想包括但不限于:
一个函数只做一个功能
函数无副作用
它正好利于修改, 利于写出符合"开闭原则"的代码.
关于错误处理
默认的errors包在对于多层的复杂应用是不够的,这种情况下建议自行封装,但别太追求完美 在项目中够用就好。我们等待官方方案即可: https://github.com/golang/go/issues/29934
关于命名
restful能解决大部分命名问题.
你的代码完全可以这样无脑命名而不失优雅.
如何使用Golang进行无心智负担的编程
这样的白话文真的很好命名与理解(根本不需要词汇量).
并发
无脑Goroution, 80%的情况下都没问题.
如果你实在担心, 用channel的做下并发数量控制就好, 或者使用更完整的工具叫"协程池", 他们的实现都不复杂.
第三方库
得益于golang的开源和这几年的蓬勃发展,golang的生态已经十分完善,所以很多情况下我们应该"面相github编程",第三方提供的代码已能满足我们大多数需求。同时 选用一个受欢迎的第三方代码库通常比自己的更可靠,后续维护也省心很多。
关于编码风格
最省心的行为是: 先跟随团队再提出意见
那么省下来的时间和精力用来干嘛?
重构(自己的)老代码。
研究更高级的与语言弱相关的架构,如Devops/分布式/微服务。
实现更多的产品或功能
OCaml(Objective Caml)是一种功能强大、静态类型的通用编程语言。它是Caml编程语言家族的一员,最初由法国国家计算机与自动化研究所(INRIA)开发,并于1996年发布第一版。
以下是一些OCaml编程语言的特点和特性:
1. 静态类型:OCaml是一种静态类型语言,这意味着变量在编译时就需要确定其类型。它具有类型推断功能,可以根据上下文自动推断变量的类型,减少编码中的类型注释。
2. 函数式编程:OCaml是一种函数式编程语言,它支持高阶函数、匿名函数、模式匹配等函数式编程特性。函数是OCaml的一等公民,可以将函数作为参数传递给其他函数,也可以将函数作为返回值。
3. 强大的类型系统:OCaml拥有丰富的类型系统,包括基本类型(如整数、浮点数、布尔值等)、复合类型(如元组、列表、数组等)、自定义类型(如记录、变体、多态等)。它还支持类型约束和模块系统,使得编写可靠和模块化的代码更加容易。
4. 模式匹配:OCaml支持强大的模式匹配功能,可以用于处理各种数据结构的递归分解、条件分支等场景。模式匹配使得编程更加简洁和可读性更高。
5. 并发和并行:OCaml提供了多线程编程的支持,可以方便地创建和管理线程。它还具有基于异步和并行计算的库,如Lwt和Async,可以实现高性能的并发和并行编程。
6. 高性能:OCaml使用单线程调度器和可选的即时编译器,以实现高效的运行时性能。它还支持内联汇编和直接访问C库,方便与底层系统进行交互。
7. 多平台支持:OCaml支持多种平台,包括UNIX/Linux、Windows、Mac OS等。它可以编译成本地代码或字节码,并提供了交互式解释器(OCaml toplevel)。
总体而言,OCaml是一种功能强大、灵活和高性能的编程语言,适用于各种应用领域,包括编译器、程序验证、并发编程、人工智能等。
一、 逻辑语义与物理语义
指令的逻辑语义与物理语义是编程的出发点。逻辑语义是指从问题和自然理解的角度的语义,物理语义是指从计算机存储和运行的角度的语义。比如, int i = 4 的逻辑语义是在程序中创建一个初始值为4的整数变量,物理语义是在计算机内存中分配了4个字节,值为0x00000004. 编程语言提供了从指令的逻辑语义到物理语义的语义映射,而我们通常是使用编程语言从逻辑语义上进行编程的。API是针对特定技术系统的逻辑语义,虽然功能更强大,但本质与拷贝数据的原子指令没有区别。当编写一行代码时,应该理解它所指代的物理语义。
二、 编码与解码
编码与解码是在计算机中表示和还原世间万物的方法和技术。 要在计算世界里解决现实世界的问题,就必须将现实世界的事物映射到计算世界里,就涉及到编码问题;要将计算世界的解映射到现实世界,就涉及到解码问题。计算机中最基本的数据表示采用二进制,即一系列的01串;以二进制来编码世间万物,这不能不说是个思维的奇迹!
三、 数据结构与算法
理解编程语言的逻辑-物理语义之后,下一步要掌握的两大武器是数据结构与算法。 数据结构是程序中存储和组织数据的重要法宝,而算法则是在数据结构之上设计的操作序列。数据结构与算法是问题求解的基础,是编写大型程序必不可少的要素,是计算世界的基石。
四、 设计模式
熟悉基本数据结构和算法之后,接下来要学习设计模式。
编写小型程序, 代码缠成一团没有关系; 但是编写中大型软件系统时,若缺乏设计模式的辅佐,代码组织就会乱成一团意大利面,难以修改、扩展和维护,系统很快就会腐化成没人想动它的废弃物。 设计模式是培养对象编程的结构化的思维体操,直接产出是各种应用框架。
五、 模块化与封装
掌握编程语言、编解码、数据结构、算法、设计模式,基本上能够胜任中小程序的构建了。不过,要驾驭中大型软件系统,就要学会将已实现的通用逻辑流(数据结构、算法、函数、方法、对象、代码结构、业务逻辑等)进行模块化与封装,成为可复用的模块,并仔细设计模块之间的交互关系。
六、 进程与内存
当构建和运行程序时,应当理解程序的运行机制。理解进程与内存的管理是必经之途。进一步地,理解程序所占用的CPU,内存,磁盘IO, 网络等资源以及程序的响应时间和并发吞吐量也是必要的。知其然而知其所以然。
只说语言层面。
嘿嘿,我念大学时也常有“又要被迫用Java了”的感觉。C# 和 Ruby 才是我大学后半的主要语言。当时最愤怒的莫过于明明不喜欢Java语言但还躲不开它…
技术上说Java语言并没有什么特别的优势。跟同质语言比,它的语言设计不如C#,而且短期内没有追近的势头(虽然从Java 8开始有进展了,但C# 6也在进步);跟异质语言比,它对native的精确控制和灵活性不如C++,动态性或者说便利性又不如Ruby、Python、JavaScript这些,在特定领域(例如高并发)的便利性又不如别的特定语言(并发如Erlang,数据处理如R),跟新一代中间应用层面语言如Go、Swift比也没法比。
要说为啥大学要用Java语言教学,那就是因为——它是门靠谱的民工语言。Java语言的设计从现在的角度看非常中庸,啥都不是特别出色,但都“还行”。出来找工作,会Java的话还是有不少选择余地的。
库方面也有非常丰富的选择,无论是核心功能还是各种扩展功能。某些核心功能如果不想用标准库的话还可以用很多第三方库来替代。例如:正则表达式不想用 java.util.regex ?有很多替代品,试试 joni ?GUI不想用 Swing ?试试新的JavaFX,或者 SWT ?…(此处填入您最喜欢的库)…
=================================================
话说回来,虽然我不喜欢Java语言,但底下的JVM我还是很喜欢的。在JavaScript引擎们爆发之前,主流JVM的技术一直是业界实用的高级语言虚拟机/运行时里的领先者。现在更多热钱流向了JavaScript引擎那边,它们终于开始接近JVM的技术水平了。但像是GC方面,最先进的通用GC技术现在恐怕还是在主流JVM里。(CLR的概念跟JVM是比较同质的,但在内部看主流JVM的实现远比CLR更动态,更能够适应变化的环境,两者的很多部分目前还不在一个层面上。当然,性能特性不同,适用于两者的性能测试方面也有很大不同。)
现在能用C++实现JVM来支撑别人跑Java的感觉很有趣首先,现在很多人都在问安卓的学习方法啊,如何入门啊,虽然我们在网上可以找了一些资料,也会有很多经验,我自己也学习安卓编程开发,现在我凭借自己所查到的看到的来进行一下总结,也希望大家少走弯路,提取一些我们编程中经常用到的技术。
第一 基础知识准备 1、Java se基础1).Java基本数据类型与表达式,分支循环。 2).String和StringBuffer的使用、正则表达式。 3).面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回收;构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类。 4).对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析;对象的多态性:子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。 5).Java异常处理,异常的机制原理。 6).常用的设计模式:Singleton、Template、Strategy模式。 7).JavaAPI介绍:种基本数据类型包装类,System和Runtime类,Date和DateFomat类等。 8).Java集合介绍:Collection、Set、List、ArrayList、LinkedList、Hashset、Map、HashMap、Iterator等常用集合类API。 9).JavaI/O输入输出流:File和FileRandomAccess类,字节流InputStream和OutputStream,字符流Reader和Writer,以及相应实现类,IO性能分析,字节和字符的转化流,包装流的概念,以及常用包装类,计算机编码。 10).Java高级特性:反射和泛型。 11).多线程原理:如何在程序中创建多线程(Thread、Runnable),线程安全问题,线程的同步,线程之间的通讯、死锁。 推荐书籍:《Thinking in java》
2、安卓学习1、学好Android、官方文档是必须看的,既全面又权威”。我们至少花一年时间把上面的guide和training都看了一遍,并且他还动手抄了几个小例子。但是这一年都看这个会很无聊,所以我们需要一边看官方文档一边看入门书籍进行实践。这里总结一下,Android入门的时候,需要有一本入门书,好好学习书中的内容,同时花一年时间把Android官方文档中的training和guide看一遍,同时通过写博客和记笔记的方式来做总结,建议让自己的每篇博客都有价值些。通过长时间的学习和坚持,相信每个人都可以达把安卓编程学习的很好。 技术要求: 基本知识点 比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画等常见技术 。
书籍推荐 《第一行代码 Android》第二版、《疯狂Android》
3、安卓编程进阶这一阶段我们需要学习的内容就很多了,比如:AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的区别; Binder:从Java层大概理解Binder的工作原理,懂Parcel对象的使用; 多进程:熟练掌握多进程的运行机制,懂Messenger、Socket等; 事件分发:弹性滑动、滑动冲突等; 玩转View:View的绘制原理、各种自定义View; 动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理; 懂性能优化、熟悉mat等工具 懂点常见的设计模式 学习方法 阅读进阶书籍,阅读Android源码,阅读官方文档并尝试自己写相关的技术文章,需要有一定技术深度和自我思考。在这个阶段的学习过程中,有一个比较难的东西困扰大家,那就是是阅读源代码。如何阅读源码呢?这是个头疼的问题,但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释可以帮你更好地了解源码中的工作原理,这个过程虽然艰苦,但是别无他法。 我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。技术要求: 稍微深入的知识点 AIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等。
书籍推荐 《Android开发艺术探索》、《Android群英传》 稍微深入的知识点 系统核心机制 基本知识点的细节 设计模式和架构 书籍推荐《Android开发艺术探索》、《Android 源码设计模式解析与实战》、《Android内核剖析》
总之就是看书、看源码和做项目,平时多种总结,尽量将知识融会贯通从而形成一种体系化的感觉。
还没有评论,来说两句吧...