php中空格怎么割开,PHP预排版文字标记〈PRE〉具体是什么作用?
pre元素可定义预格式化的文本。被包围在pre元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。<pre>标签的一个常见应用就是用来表示计算机的源代码。可以导致段落断开的标签(例如标题、<p>和<address>标签)绝不能包含在<pre>所定义的块里。
尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的。
pre元素中允许的文本可以包括物理样式和基于内容的样式变化,还有链接、图像和水平分隔线。
当把其他标签(比如<a>标签)放到<pre>块中时,就像放在HTML/XHTML文档的其他部分中一样即可。
常用的软件有哪些?
软件简介:
PyCharm Professional 2020.1是由JetBrains公司打造的一款Python语言集成开发环境,经常被Python开发人员用于人工智能、机器人等开发工作中,是全世界用户首选的Python开发软件。它拥有一套非常完整的Python语言编程开发功能,包含语法高亮、项目管理、语言调试、版本控制、智能提醒、单元测试、代码分析等等,可以帮助用户轻松管理开发中的项目,或是高亮显示重要的代码,多种功能使得程序员开发效率更高,提升编码效率。同时pycharm 2020.1支持各种Python框架,包含Django、Flask、Pyramid等框架,还支持SQL、JavaScript、Cython等多样的模板,让用户开发更方便。
安装步骤:
1.选择我们下载的安装包,右键解压。2.解压后,右键以管理员身份运行安装程序。3.点击Next。4.如需修改安装路径,直接将C修改为你需要安装到的盘,本例安装到D盘,点击Next。5.勾选后点击Next。6.点击Install。7.软件安装中……8.点击Finish。9.双击打开桌面PyCharm软件。10.点击左下角【Skip……】。11.选择【Evaluate for free】,点击Evaluate。12.打开解压后的安装包,进入【Crack】pj文件夹。13.将图示文件拖入到软件窗口中。14.点击Restart。15.点击【为Pycharm安装】。16.点击是。17.英文版安装成功;如需使用中文版,退出软件窗口,开始下面的汉化操作。18.打开安装包汉化包文件夹,复制图示文件到软件安装目录(参考第4步安装路径)。19.打开图示路径,在空白处右键粘贴。20.双击打开桌面PyCharm软件。21.点击创建项目。温馨提示:创建项目时会在线下载Python安装,建议先安装Python环境,再创建项目;22.软件安装完成,运行界面如下。什么样的代码叫好代码?
送大家以下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 年!
后续增加一些实际的例子来说明好的和坏的代码;分享下如何编写整洁代码——自己认为有用的一些编程技巧。
如何用好谷歌等搜索引擎?
你到底有没有试过用你贴的那个图搜索东西?你是在说你翻墙很厉害吗?
我这儿即使是用你贴图那个网址,也用不了谷歌搜索啊。
用都用不了,何来用好呢?
如果一定要说用好的话,先能用再说吧。
谷歌全球移动搜索占有率惊人:98.29%(图)[导读]无须多言,Android帮助Google在移动市场上攻城略地。另一件可能发生的事是Windows Phone 7,它可能会是一个成功的系统,它会增强必应搜索在移动市场的份额。
Pingdom网站根据StatCounter最近的统计信息制作了上图,Google目前是移动搜索的巨无霸,全球市场占有率达到惊人的98.29%(桔红色条),第二名Yahoo同学才只有0.8%的市场份额,而Bing比Yahoo还可怜只有0.46%。即便是桌面的搜索(鲜红色条),Google也以90.57%绝对性的压倒Yahoo和Bing。
借用马云一句很有名的话:在移动搜索领域,Google架起超高倍射电望远镜也看不到对手在哪里……
Pingdom网站全文如下:
数年来,Google已经统治了搜索市场,但它至少还有一些竞争对手。如果你看看移动搜索(即通过移动设备搜索,当中大多是智能手机的搜索),Google完全压倒了竞争对手。
在这里,我们有两个事情要强调一下。它们如同一个硬币的两面,但值得独立指出来:
1、Google的移动搜索市场份额是垄断的,而且基本已经完全占据市场。在移动板块中,相比于其它搜索引擎来说,Google获得了难以置信的市场份额。其它的搜索引擎甚至无法从移动搜索中获得一个百分点。
2、在全球的搜索市场中,Google的份额已经很惊人,但是在移动市场上它的份额还要大。至于雅虎与必应,情况完全相反。
如果Google坚信移动是未来,那么它的努力方向是正确的。
另外,Google在移动上的垄断一直在增强。一年前,它在移动搜索上的份额为95.58%,比今天的98.29%低。没有人知道,再过几个月会不会达到99%。
能改变什么?
无须多言,Android帮助Google在移动市场上攻城略地。在这个平台上,Google搜索依然是首选。
还有iPhone,它是另一个版本的故事。如果苹果将Google踢出iOS平台,Google在移动市场的地位将受挫。即使两家公司是竞争对手,我们也不认为这种事情会发生。苹果一旦更张,用戶可能会恼怒。
另一件可能发生的事是Windows Phone 7,它可能会是一个成功的系统,它会增强必应搜索在移动市场的份额。
谈及搜索,Google似乎有必要进一步将自己的搜索控制力渗透到移动领域。Google获得此地位,早期归功于与苹果的合作,后来又有Android保驾,比较有讽刺意味的是将苹果变成竞争对手可能会是对自己威胁。
如何实现PHP自动创建数据库?
你做好程序以后,把数据库导出成sql文件
1、连接数据库
2、读取这个sql文件里的sql语句,并执行
3、生成一个数据库连接参数的php文件
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
if (mysql_query("CREATE DATABASE my_db",$con))
{
echo "Database created";
}
else
{
echo "Error creating database: " . mysql_error();
}
mysql_close($con);
?>
<?php
class ReadSql {
//数据库连接
protected $connect = null;
//数据库对象
protected $db = null;
//sql文件
public $sqlFile = "";
//sql语句集
public $sqlArr = array();
public function __construct($host, $user, $pw, $db_name) {
$host = empty($host) ? C("DB_HOST") : $host;
$user = empty($user) ? C("DB_USER") : $user;
$pw = empty($pw) ? C("DB_PWD") : $pw;
$db_name = empty($db_name) ? C("DB_NAME") : $db_name;
//连接数据库
$this->connect = mysql_connect($host, $user, $pw) or die("Could not connect: " . mysql_error());
$this->db = mysql_select_db($db_name, $this->connect) or die("Yon can not select the table:" . mysql_error());
}
//导入sql文件
public function Import($url) {
$this->sqlFile = file_get_contents($url);
if (!$this->sqlFile) {
exit("打开文件错误");
} else {
$this->GetSqlArr();
if ($this->Runsql()) {
return true;
}
}
}
//获取sql语句数组
public function GetSqlArr() {
//去除注释
$str = $this->sqlFile;
$str = preg_replace('/--.*/i', '', $str);
$str = preg_replace('/\/\*.*\*\/(\;)?/i', '', $str);
//去除空格 创建数组
$str = explode(";\n", $str);
foreach ($str as $v) {
$v = trim($v);
if (empty($v)) {
continue;
} else {
$this->sqlArr[] = $v;
}
}
}
//执行sql文件
public function RunSql() {
foreach ($this->sqlArr as $k => $v) {
if (!mysql_query($v)) {
exit("sql语句错误:第" . $k . "行" . mysql_error());
}
}
return true;
}
}
//范例:
header("Content-type:text/html;charset=utf-8");
$sql = new ReadSql("localhost", "root", "", "log_db");
$rst = $sql->Import("./log_db.sql");
if ($rst) {
echo "Success!";
}
?>