怎么样才算懂php,什么样的代码叫好代码?
送大家以下java学习资料
简介: 我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解,今天谈谈我对于好代码的理解。
我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。显然,这个问题并没有唯一的标准答案,谁都可以谈论自己的理解,今天谈谈我对于好代码的理解。
一句话概括衡量代码质量的唯一有效标准:WTF/min —— Robert C. Martin
Bob大叔对于好代码的理解非常有趣,对我也有很大的启发。我们编写的代码,除了用于机器执行产生我们预期的效果以外,更多的时候是给人读的,这个读代码的可能是后来的维护人员,更多时候是一段时间后的作者本人。
我敢打赌每个人都遇到过这样的情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生。
我们自己写的代码,一段时间后自己看尚且如此,更别提拿给别人看了。
任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler
所以,谈到好代码,首先跳入自己脑子里的一个词就是:整洁。
好的代码一定是整洁的,给阅读的人一种如沐春风,赏心悦目的感觉。
整洁的代码如同优美的散文。—— Grady Booch
好代码的特性很难给好的代码下一个定义,相信很多人跟我一样不会认为整洁的代码就一定是好代码,但好代码一定是整洁的,整洁是好代码的必要条件。整洁的代码一定是高内聚低耦合的,也一定是可读性强、易维护的。
高内聚低耦合
高内聚低耦合几乎是每个程序员员都会挂在嘴边的,但这个词太过于宽泛,太过于正确,所以聪明的编程人员们提出了若干面向对象设计原则来衡量代码的优劣:
开闭原则 OCP (The Open-Close Principle)单一职责原则 SRP (Single Responsibility Principle)依赖倒置原则 DIP (Dependence Inversion Principle)最少知识原则 LKP (Least Knowledge Principle)) / 迪米特法则 (Law Of Demeter)
里氏替换原则 LSP (Liskov Substitution Principle)接口隔离原则 ISP (Interface Segregation Principle)组合/聚合复用原则 CARP (Composite/Aggregate Reuse Principle)这些原则想必大家都很熟悉了,是我们编写代码时的指导方针,按照这些原则开发的代码具有高内聚低耦合的特性。换句话说,我们可以用这些原则来衡量代码的优劣。
但这些原则并不是死板的教条,我们也经常会因为其他的权衡(例如可读性、复杂度等)违背或者放弃一些原则。比如子类拥有特性的方法时,我们很可能打破里氏替换原则。再比如,单一职责原则跟接口隔离原则有时候是冲突的,我们通常会舍弃接口隔离原则,保持单一职责。只要打破原则的理由足够充分,也并不见得是坏的代码。
可读性
代码只要具有了高内聚和低耦合就足够好了吗?并不见得,我认为代码还必须是易读的。好的代码无论是风格、结构还是设计上都应该是可读性很强的。可以从以下几个方面考虑整洁代码,提高可读性。
命名
大到项目名、包名、类名,小到方法名、变量名、参数名,甚至是一个临时变量的名称,其命名都是很严肃的事,好的名字需要斟酌。
► 名副其实
好的名称一定是名副其实的,不需要注释解释即可明白其含义的。
/** * 创建后的天数 **/ int d; int daysSinceCreation;
后者比前者的命名要好很多,阅读者一下子就明白了变量的意思。
► 容易区分
我们很容易就会写下非常相近的方法名,仅从名称无法区分两者到底有啥区别(eg. getAccount()与getAccountInfo()),这样在调用时也很难抉择要用哪个,需要去看实现的代码才能确定。
► 可读的
名称一定是可读的,易读的,最好不要用自创的缩写,或者中英文混写。
► 足够短
名称当然不是越长越好,应该在足够表达其含义的情况下越短越好。
格式
良好的代码格式也是提高可读性非常重要的一环,分为垂直格式和水平格式。
► 垂直格式
通常一行只写一个表达式或者子句。一组代码代表一个完整的思路,不同组的代码中间用空行间隔。
public class Demo { @Resource private List<Handler> handlerList; private Map<TypeEnum, Handler> handlerMap = new ConcurrentHashMap<>(); @PostConstruct private void init() { if (!CollectionUtils.isEmpty(handlerList)) { for (Handler handler : handlerList) { handlerMap.put(handler.getType(), handler); } } } publicResult<Map<String, Object>> query(Long id, TypeEnum typeEnum) { Handler handler = handlerMap.get(typeEnum); if (null == handler) { return Result.returnFailed(ErrorCode.CAN_NOT_HANDLE); } return handler.query(id); } }
如果去掉了空行,可读性大大降低。
public class Demo { @Resource private List<Handler> handlerList; private Map<TypeEnum, Handler> handlerMap = new ConcurrentHashMap<>(); @PostConstruct private void init() { if (!CollectionUtils.isEmpty(handlerList)) { for (Handler handler : handlerList) { handlerMap.put(handler.getType(), handler); } } } public Result<Map<String, Object>> query(Long id, TypeEnum typeEnum) { Handler handler = handlerMap.get(typeEnum); if (null == handler) { return Result.returnFailed(ErrorCode.CAN_NOT_HANDLE); } return handler.query(id); } }
类静态变量、实体变量应定义在类的顶部。类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter 方法。
► 水平格式
要有适当的缩进和空格。
► 团队统一
通常,同一个团队的风格尽量保持一致。集团对于 Java 开发进行了非常详细的规范。(可点击下方阅读原文,了解更多内容)
类与函数
► 类和函数应短小,更短小
类和函数都不应该过长(集团要求函数长度最多不能超过 80 行),过长的函数可读性一定差,往往也包含了大量重复的代码。
► 函数只做一件事(同一层次的事)
同一个函数的每条执行语句应该是统一层次的抽象。例如,我们经常会写一个函数需要给某个 DTO 赋值,然后再调用接口,接着返回结果。那么这个函数应该包含三步:DTO 赋值,调用接口,处理结果。如果函数中还包含了 DTO 赋值的具体操作,那么说明此函数的执行语句并不是在同一层次的抽象。
► 参数越少越好
参数越多的函数,调用时越麻烦。尽量保持参数数量足够少,最好是没有。
注释
► 别给糟糕的代码加注释,重构他
注释不能美化糟糕的代码。当企图使用注释前,先考虑是否可以通过调整结构,命名等操作,消除写注释的必要,往往这样做之后注释就多余了。
► 好的注释提供信息、表达意图、阐释、警告
我们经常遇到这样的情况:注释写的代码执行逻辑与实际代码的逻辑并不符合。大多数时候都是因为代码变化了,而注释并没有跟进变化。所以,注释最好提供一些代码没有的额外信息,展示自己的设计意图,而不是写具体如何实现。
► 删除掉注释的代码
git等版本控制已经帮我们记录了代码的变更历史,没必要继续留着过时的代码,注释的代码也会对阅读等造成干扰。
错误处理
► 错误处理很重要,但他不能搞乱代码逻辑
错误处理应该集中在同一层处理,并且错误处理的函数最好不包含其他的业务逻辑代码,只需要处理错误信息即可。
► 抛出异常时提供足够多的环境和说明,方便排查问题
异常抛出时最好将执行的类名,关键数据,环境信息等均抛出,此时自定义的异常类就派上用场了,通过统一的一层处理异常,可以方便快速地定位到问题。
► 特例模型可消除异常控制或者 null 判断
大多数的异常都是来源于NPE,有时候这个可以通过 Null Object 来消除掉。
► 尽量不要返回 null ,不要传 null 参数
不返回 null 和不传 null 也是为了尽量降低 NPE 的可能性。
如何判断不是好的代码讨论了好代码的必要条件,我们再来看看好代码的否定条件:什么不是好的代码。Kent Beck 使用味道来形容重构的时机,我认为当代码有坏味道的时候,也代表了其并不是好的代码。
代码的坏味道
► 重复
重复可能是软件中一切邪恶的根源。—— Robert C.Martin
Martin Fowler 也认为坏味道中首当其冲的就是重复代码。
很多时候,当我们消除了重复代码之后,发现代码就已经比原来整洁多了。
► 函数过长、类过大、参数过长
过长的函数解释能力、共享能力、选择能力都较差,也不易维护。
过大的类代表了类做了很多事情,也常常有过多的重复代码。
参数过长,不易理解,调用时也容易出错。
► 发散式变化、霰弹式修改、依恋情结
如果一个类不是单一职责的,则不同的变化可能都需要修改这个类,说明存在发散式变化,应考虑将不同的变化分离开。
如果某个变化需要修改多个类的方法,则说明存在霰弹式修改,应考虑将这些需要修改的方法放入同一个类。
如果函数对于某个类的兴趣高于了自己所处的类,说明存在依恋情结,应考虑将函数转移到他应有的类中。
► 数据泥团
有时候会发现三四个相同的字段,在多个类和函数中均出现,这时候说明有必要给这一组字段建立一个类,将其封装起来。
► 过多的 if...else 或者使用 switch
过多的 if...else 或者 switch ,都应该考虑用多态来替换掉。甚至有些人认为除个别情况外,代码中就不应该存在 if...else 。
总结本文首先一句话概括了我认为的好代码的必要条件:整洁,接着具体分析了整洁代码的特点,又分析了好代码的否定条件:什么样的代码不是好的代码。仅是本人的一些见解,希望对各位以后的编程有些许的帮助。
我认为仅仅编写出可运行的代码是远远不够的,还要时刻注意代码的整洁度,留下一些漂亮的代码,希望写的代码都能保留并运行 102 年!
后续增加一些实际的例子来说明好的和坏的代码;分享下如何编写整洁代码——自己认为有用的一些编程技巧。
php和java相比?
谢邀!
Java和PHP的选择,对于新手来说,的确是一个难题。接下来,我就从各个方面来分析java和php的优劣势,希望对大家有所帮助。
1.语言难易php是一门解释执行的脚本语言,语法和c语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用php。
而java要先编译成class文件,然后在jvm上运行。java开发需要熟悉java语法以及一些核心的架构,从而实现一种可复用的、跨平台的软件。java培训也要比php培训难得多。
2.技术架构从技术架构来说,java语言比php语言有明显的优势。java语言使用的是面向对象的系统设计方法,而php还是采用面向过程的开发方法。
php只能实现简单的两层或三层架构,而java可以实现多层架构。
在java中,数据库层、应用逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有了一些成熟的框架支持。例如:struct2就是利用java的web开发技术从而实现mvc的设计模式;业务逻辑层也有spring框架;数据库持久化层也有hibernate等框架。这些框架可以方便开发者高效、科学、合理的架构多层商业应用。从数学运算及数据库访问速度来说,java是优于php的性能的。
实际上,对于跨平台的大型商业应用来说,java开发几乎成为他们的唯一选择。
3.技术层面java是纯面向对象开发,功能强大,分支众多,没有java不能制作的软件。c/s也好,b/s也好,从功能上讲,没有能与java媲美的。
php属于后期之秀,吸收了java、c和perl等语言的优点,专注互联网领域。web领域php拥有得天独厚的优势,web领域没有其他语言可以相比。
4.发展空间安卓势头很猛,但手机安装app数量有限,推广难,也是app面临的最大挑战。好在安卓只有java可以做,除此之外就是html5了。
目前来说,互联网的发展空间很大,而互联网的发展离不开web,web开发离不开php。
两者相比,php的优势更加明显。
5.薪资比较薪资是由供应关系决定的,人才缺失,薪资自然高;相反,人才饱和,薪资不会高。
从企业需求来看,java的需求量是比较大的。但java学习的人太多,而php方面的人才要少得多。所以,明面上来看,php的薪资要比java高一些。但java只要学得好,薪资自然也会水涨船高。
技术高了,就不怕薪资少了。
6.适用性php适用于快速开发,中小型应用系统,开发成本低,能够对快去变更的需求作出反应。
而java适合于开发大型的应用系统,应用前景比较广阔,系统易维护,复用性好。还有,同样的应用系统开发java开发要比php开发价格要高。
总结不管java还是php都是一种不错的选择,毕竟两者都在发展势头上。但从长远角度来看,java还是要优于php的,毕竟java的性能、处理数据各方面比较好。当然,最终选择权还是在你自己的手中!
前端如何熟悉php开发的项目?
这个还是需要基础的,你这个截图看是tp开发的,基本现在tp就三个大版本,tp3.2,tp5,tp6这三个版本了
如果你想完全理解代码,需要去看一下php 的基础,还需要去学习thinkphp框架,看看是哪个版本的,这三个版本改动都比较大,特别是3.2和5之间改动了特别大,我看截图,入口文件的名称也做了修改,对于新手理解起来会比较麻烦。
这程序引入了很多组件excel,支付等,你要完全懂都要去挨个搞明白,还是比较困难的,周围有懂的建议你直接请教吧,学一门语言需要一定的时间,前端理解后端的东西,不太容易。
你经常阅读吗?
我非常喜欢阅读,还一边阅读,一边思考,读书内书外,思考书内书外。
书中自有黄金屋,书中自有颜如玉。
世事洞明皆学问,人情练达即文章。是阅读思考帮了大忙,善阅读者,无之不为书,书是书,报是书,山水是书,棋酒亦书,一切皆书,皆可阅读。
阅读使人增长知识,增加智慧,增添能力,很好锻炼想象力、洞察力,开阔了心胸,开阔了眼界视野,获得乐趣幸福。阅读早成了我的生活习惯,一天不阅读,就会感到闷的慌。
人生一乐,读心爱之书;人生一叹,做己喜欢之事。读书明理,行事便无愧,阅读愈多,明事愈了,行事愈好。有书赶快读,别拖别偷懒,时间是海绵里的水,肯挤就会有,多抽时间读书吧,磨刀不误砍柴功。多阅读,有百利而无一害。读万卷书,行万里路,赏千秋景!
阅读最好做到四到:眼到,口到,心到,笔到。仅有眼到口到是远远下够的,重要还要心到,要重于独立思考,不要读什么就信什么,要会辨识辨证,能分是非好坏正邪优劣善恶,读内还要知外,明白弦内音,更识弦外意。
黑客入门学习哪些知识?
根据我所知道回答一下这个问题。
这里暂且理解为网络安全的需要了解的一些知识。
网络基础知识,特别是网络协议
编程的基础知识
Linux的基础知识
web安全的基本知识
网络运维的基本知识
... ...
网络基础知识,特别是网络协议熟练掌握TCP/IP分层模型,知道每层完成的功能,传输的报文,以及对应的协议;
熟练掌握一些重要的协议,比如http、dns、arp、tcp、udp等协议;
熟练掌握组网的基础知识,比如局域网组网,vlan、路由协议等;
掌握一些网络设备的配置,例如华为网络设备的配置,知道如何组建局域网、如何通过路由协议组建网络等。
编程的基础知识至少要掌握C语言的编程,灵活应用指针、struct结构;
至少掌握一门脚本语言,推荐python语言,可以直接调用C语言的库,并且非常的灵活,现在很多网络安全工具是用python编写的;
能够看懂汇编语言,用于理解常见的漏洞。
Linux的基础知识linux的基本使用操作,熟练掌握常用的命令,防火墙的配置等;
linux各类服务器的搭建,比如ftp服务器、dns服务器等;
数量掌握网络安全渗透平台kali的使用,kali广泛用于网络渗透测试和审计,是一个综合的网络安全渗透测试平台。
web安全的基本知识熟练掌握http协议的知识,能够分析http数据包
了解前台的html语言、javascript代码、jquery框架,后端的mysql数据库,以及常用的php语言,用于分析web安全漏洞;
熟练掌握xss跨站脚本攻击,xss是非常流行的web安全漏洞,会手动和工具发现xss漏洞;
数量掌握sql注入的知识,能够手工或者工具发现sql注入漏洞。
网络运维的基本知识网络设备的配置,比如vlan配置、vrrp配置、ospf配置、rip配置、snmp配置等;
数量掌握通过snmp获取网络设备的流量、运行状态等数据;
数量掌握linux系统、windows系统运维的基础知识。
总结网络安全是一门综合性的学科,需要连接网络的方方面面,需要不断的学习、实践和总结。
对于网络安全的学习,大家有什么看法呢,欢迎在评论区留言讨论。
如需更多帮助,请私信关注。谢谢