php20140426
叫老大不光是因为职位比我高,还因为技术也让人佩服!
今天跟老大聊聊我们一些代码结构的问题,有些可能会对你是有帮助的。如果大家有不同的看法,可以提出来,一起讨论一下。
对话1>单个文件巨大(超过5000行)
我:文件大会不会影响性能啊?PHP语言在处理源文件的时候(这个主要是php的词法分析和语法分析),会将源文件切分为一个一个的标记(token)。如果文件很大的话,把我们当前不需要的方法都会做标记的,这样不是明显影响性能吗?
老大:这个在性能方面的影响是比较小的。我们在考虑性能的时候,要考虑全局观,比如展示页面的时候,打开页面很慢,那我们首先考虑的就不是文件大小的问题,而是每个模块的加载速度。比如,通过你的断点设置,你发现某个产品列表的读取是比较慢的,那就要考虑,是不是组装数据慢了,还是从接口(数据库或者中间层)读数据慢了?如果是组装数据慢了,那就要重构这个算法,或者跟产品人员商量能否修改方案。如果是接口读取数据慢了,那是不是需要加机器或者加索引来解决问题。——所以,考虑性能问题,不能抓住小问题,要考虑的是最影响性能的地方进行修改。
我:那如果切分大文件类到不同的类有什么不好吗?
老大:如果在一个方法体中,你通过很多的require_once添加很多的类文件,那么不也是影响性能吗?——require_once本身也耗费性能!
给我画了一张图(类似于上面的图):
我:那我可以用include,逻辑加载文件,按条件加载文件。这样就能减少加载文件的数目!
老大:那么你怎么按照条件加载?
我:比如,我可以按照分类去加载文件,电影的时候,我就把电影相关的程序文件加载进来,电视的时候就把电视相关的程序文件加载进来。
老大:那将来电视要用到电影里的内容的时候,你怎么办?或者很多分类用到你电影分类里的内容的时候你怎么办?
我:那我就放置一堆的"||"代码(如if('电影' === $category || '电视' === $category || '音乐' === $category){})。 后来我琢磨了一下,确实是,这样做的话,一个方法里会有很多这种if语句,那我要对应某一个分类内容的时候,我就要看一堆的if了。还真不如写在一块呢或者重构代码了!
2>autoload()方法。
类似下面的代码。
<?php Test::getName();
} |
运行结果:
我们都知道__autoload()方法性能并不是很好,一般不鼓励去使用这个方法。所以,我在调用类的时候,我就加了这么一句:
我:我觉得__autoload方法性能不是很好,所以我在调用别的模块的时候,我就用了include方法。
老大:你这样做,一是整个代码看起来没那么规范,二是,如果将来要修改框架了,我们就要查看所有的这样的代码文件,因为比如,你的入口文件移动到别的文件夹下面,那么你的Test.class.php文件在什么位置,你知道吗?
如果我们调用__autoload()方法,我们只需要修改这个接口就可以了,因为所有的类调用都经过了这个方法,这样比较好管理。
3> 一个方法尽量保持在一个屏幕内,一行不超过80个字符。
我:我觉得我们的类里面的方法太长了,很多都超过几个屏幕,才能把当前的方法看完。我个人比较推崇"尽量把方法放在一个屏幕内"和"让一个方法做一件事"。有的时候看到一个很长的方法的时候头大了!
老大:一个方法就是做一件事啊,比如test()方法,就做test()。以前php没有面向对象的时候,我们经常不是把代码都写在一个文件里吗?
我们不应该“为了拆方法,而把方法硬性拆分。而应该是因为业务需要而对方法拆分!”。而且函数调用我们知道,本身也是耗费性能和内存的。如果你这个方法体内的有些部分,其他方法也要调用,那么这时候你可以把这部分代码做成一个方法。
如果你的方法里有很多调用其他类里的方法,不也看着很麻烦吗?还不如写到一个方法里呢!这样还比较直观些。
4> 找回以前删除的代码。
我:如果某个功能产品要求撤下来,但是过了很长一段时间,产品又要求再上这个功能。那么我原来的代码是删除呢?还是只做注释呢!
老大:删除掉!我:那我怎么恢复呢?要把原来代码做备份吗?
老大:你可以使用版本管理软件做恢复。如svn。
例子演示:(1)最初代码(2)产品要求下线代码
svn提交代码:
(3)隔了一段时间,产品又要求重新上线该模块。
svn操作:先查询日志,然后针对日志进行合并
上面的问题,我估计你也遇到过,所以大家共勉下吧!
题外话:曾经我在离开一家工作一年的公司的时候!项目经理就跟我说你如果频繁跳槽,会对你的将来的发展是不利的,但是没有告诉我怎么不利?现在我有点明白了,因为我到过的公司很多技术过硬的人,都是在这个公司带过3年以上的人。我发现如果你在一家公司待很长时间,对你的技术提升是很有帮助的。
1》 不停的重构代码,提升你的代码质量。
我们开始进入公司的时候,一般都是公司急需赶个项目人手缺乏。等项目完成,一般都是1年左右。如果你在公司待足够长的时间,这个项目多多少少会跟你扯上边的,这时候,你会不停的翻看自己的代码,你也会不断的调整代码, 不断的重构你的代码——跟写文章一眼,你不停的看自己写过的文章,你会不停的做修改,越修改你的文章会越让你喜欢。
2》业务熟悉,能够更快更好的写出代码!——我个人比较喜欢“行云流水”似的感觉。
你如果在一个公司待了很长一段时间,那么你对这个领域是非常熟悉的。新需求上来,你会很快的知道怎么做代码架构,比如上面提到的,你就知道方法中,哪些代码部分可以抽出来,独立做成一个方法;你也会知道,将来什么地方会频繁修改的。——写代码,如行云流水般!
附件:跟老大对话
3 2012 档案
PHP 跟老大的对话
摘要: 思维导图介绍 叫老大不光是因为职位比我高,还因为技术也让人佩服! 今天跟老大聊聊我们一些代码结构的问题,有些可能会对你是有帮助的。如果大家有不同的看法,可以提出来,一起讨论一下。对话1>单个文件巨大(超过5000行)我:文件大会不会影响性能啊?PHP语言在处理源文件的时候(这个主要是php的词法分析和语法分析),会将源文件切分为一个一个的标记(token)。如果文件很大的话,把我们当前不需要的方法都会做标记的,这样不是明显影响性能吗?老大:这个在性能方面的影响是比较小的。我们在考虑性能的时候,要考虑全局观,比如展示页面的时候,打开页面很慢,那我们首先考虑的就不是文件大小的问题,而是每个模阅读全文
posted @ 2012-03-21 06:07 川山甲 阅读(621) | 评论 (7) 编辑
MYSQL 浅谈MyISAM 存储引擎
摘要: 思维导图介绍 mysql中用的最多存储引擎就是innodb和myisam。做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对《高性能MYSQL》书中提到的myisam的理解,请大家多多指教。特点> 不支持事务 证明如下: >> 表记录:t2表的engine是myisam。 >> 操作注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务。>> 下面请看innodb中的事务操作> 存储结构:数据文件(.MYD),索引文件(.MYI)和结构文件(.frm) >> 特点:可以在不阅读全文
posted @ 2012-03-15 17:16 川山甲 阅读(846) | 评论 (2) 编辑
MYSQL 逻辑架构摘要: 思维导图前言》 Mysql并非尽善尽美,但足够灵活,能适应高要求环境,如Web应用。》 Mysql在众多平台上运行良好,支持多种数据类型,但不支持对象类型(Mongodb支持)》 Mysql的存储引擎可以基于表建立,以满足对数据存储,性能,特征及其他特性的各种需要。架构逻辑视图每个虚线框为一层,总共三层。第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等。第二层,核心层:查询解析,分析,优化,缓存,提供内建函数;存储过程,触发器,视图。第三层,存储引擎层,不光做存储和提取数据,而且针对特殊数据引擎还要做事务处理。连接管理与安全性(第一层 服务层)> 处理流程Δ 每个连接的阅读全文
posted @ 2012-03-15 11:09 川山甲 阅读(938) | 评论 (0) 编辑
PHP 正则表达式摘要: 思维导图点击下图,可以看具体内容!介绍 正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net,php等等,我今天就把我对正则表达式的理解跟大家唠唠,不当之处,请多多指教!需要知道的术语——下面的术语你知道多少?Δ 定界符Δ 字符域Δ 修饰符Δ 限定符Δ 脱字符Δ 通配符(正向预查,反向预查)Δ 反向引用Δ 惰性匹配Δ 注释Δ 零字符宽定位 我们什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,php在某些方面用正则反而影响效率。当我们遇到复杂文本数据的解析时候,用正则是比较好的选择。优点 正则表达式在处理复杂字符操阅读全文
posted @ 2012-03-12 16:32 川山甲 阅读(1057) | 评论 (7) 编辑
PHP 代码规范摘要: 命名规范Θ 类文件都以.class.php为后缀,使用驼峰法命名,并且首字母大写,例如 Pay.class.php;Θ 类名和目录_文件名一致。例如:类名Zend_Autoloader的目录是Zend/Autoloader.class.php;Θ 函数的命名使用小写字母和下划线的方式。例如:get_client_ip;Θ 方法的命名使用驼峰法,首字母小写或者使用下划线"_",例如listComment(),_getResource(),通常下划线开头的方法属于私有方法;Θ 属性的命名使用驼峰法,首字母小写或者使用下划线"_",如$username,$_i阅读全文
posted @ 2012-03-08 16:43 川山甲 阅读(1201) | 评论 (5) 编辑
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同!
摘要: 介绍今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异。预编译优点1.使用占位符,避免逐字输入数据到SQL中。自动处理引号和反斜线等字符的转义——增加安全性。2.预先“准备”一条语句,然后在每次执行时绑定不同值达到重用的目的。——常用于以后被多次执行的语句。3.可读性强。代码数据库连接代码都一样.$protol = 'mysql:host=localhost;dbname=test';$username = 'monty';$passwd = '0818';$dbh = new PDO($protol, $userna阅读全文
posted @ 2012-03-05 13:19 川山甲 阅读(1121) | 评论 (1) 编辑

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

StableDiffusion3的论文终于来了!这个模型于两周前发布,采用了与Sora相同的DiT(DiffusionTransformer)架构,一经发布就引起了不小的轰动。与之前版本相比,StableDiffusion3生成的图质量有了显着提升,现在支持多主题提示,并且文字书写效果也得到了改善,不再出现乱码情况。 StabilityAI指出,StableDiffusion3是一个系列模型,其参数量从800M到8B不等。这一参数范围意味着该模型可以在许多便携设备上直接运行,从而显着降低了使用AI

一先导与重点文章主要介绍自动驾驶技术中几种常用的坐标系统,以及他们之间如何完成关联和转换,最终构建出统一的环境模型。这里重点理解自车到相机刚体转换(外参),相机到图像转换(内参),图像到像素有单位转换。3d向2d转换会有相应的畸变,平移等。重点:自车坐标系相机机体坐标系需要被重写的是:平面坐标系像素坐标系难点:要考虑图像畸变,去畸变和加畸变都是在像平面上去补偿二简介视觉系统一共有四个坐标系:像素平面坐标系(u,v)、图像坐标系(x,y)、相机坐标系()和世界坐标系()。每种坐标系之间均存在联系,

轨迹预测在自动驾驶中承担着重要的角色,自动驾驶轨迹预测是指通过分析车辆行驶过程中的各种数据,预测车辆未来的行驶轨迹。作为自动驾驶的核心模块,轨迹预测的质量对于下游的规划控制至关重要。轨迹预测任务技术栈丰富,需要熟悉自动驾驶动/静态感知、高精地图、车道线、神经网络架构(CNN&GNN&Transformer)技能等,入门难度很大!很多粉丝期望能够尽快上手轨迹预测,少踩坑,今天就为大家盘点下轨迹预测常见的一些问题和入门学习方法!入门相关知识1.预习的论文有没有切入顺序?A:先看survey,p

这篇论文探讨了在自动驾驶中,从不同视角(如透视图和鸟瞰图)准确检测物体的问题,特别是如何有效地从透视图(PV)到鸟瞰图(BEV)空间转换特征,这一转换是通过视觉转换(VT)模块实施的。现有的方法大致分为两种策略:2D到3D和3D到2D转换。2D到3D的方法通过预测深度概率来提升密集的2D特征,但深度预测的固有不确定性,尤其是在远处区域,可能会引入不准确性。而3D到2D的方法通常使用3D查询来采样2D特征,并通过Transformer学习3D和2D特征之间对应关系的注意力权重,这增加了计算和部署的

笔者的一些个人思考在自动驾驶领域,随着BEV-based子任务/端到端方案的发展,高质量的多视图训练数据和相应的仿真场景构建愈发重要。针对当下任务的痛点,“高质量”可以解耦成三个方面:不同维度上的长尾场景:如障碍物数据中近距离的车辆以及切车过程中精准的朝向角,以及车道线数据中不同曲率的弯道或较难采集的匝道/汇入/合流等场景。这些往往靠大量的数据采集和复杂的数据挖掘策略,成本高昂。3D真值-图像的高度一致:当下的BEV数据获取往往受到传感器安装/标定,高精地图以及重建算法本身的误差影响。这导致了我

突然发现了一篇19年的论文GSLAM:AGeneralSLAMFrameworkandBenchmark开源代码:https://github.com/zdzhaoyong/GSLAM直接上全文,感受这项工作的质量吧~1摘要SLAM技术最近取得了许多成功,并吸引了高科技公司的关注。然而,如何同一现有或新兴算法的界面,一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本文,提出了一个名为GSLAM的新型SLAM平台,它不仅提供评估功能,还为研究人员提供了快速开发自己的SLAM系统的有用

请留意,这个方块人正在紧锁眉头,思考着面前几位“不速之客”的身份。原来她陷入了危险境地,意识到这一点后,她迅速展开脑力搜索,寻找解决问题的策略。最终,她决定先逃离现场,然后尽快寻求帮助,并立即采取行动。与此同时,对面的人也在进行着与她相同的思考……在《我的世界》中出现了这样一个场景,所有的角色都由人工智能控制。他们每个人都有着独特的身份设定,比如之前提到的女孩就是一个年仅17岁但聪明勇敢的快递员。他们拥有记忆和思考能力,在这个以《我的世界》为背景的小镇中像人类一样生活。驱动他们的,是一款全新的、

23年9月国防科大、京东和北理工的论文“DeepModelFusion:ASurvey”。深度模型融合/合并是一种新兴技术,它将多个深度学习模型的参数或预测合并为一个模型。它结合了不同模型的能力来弥补单个模型的偏差和错误,以获得更好的性能。而大规模深度学习模型(例如LLM和基础模型)上的深度模型融合面临着一些挑战,包括高计算成本、高维参数空间、不同异构模型之间的干扰等。本文将现有的深度模型融合方法分为四类:(1)“模式连接”,通过一条损失减少的路径将权重空间中的解连接起来,以获得更好的模型融合初
