北京总部

软件开发培训:里氏替换原则丨鸵鸟的例子

软件开发培训:里氏替换原则丨鸵鸟的例子

2017-02-14

"里氏替换原则"听起来非常的复杂,但是设计思想却是非常基础的。看下面这个有趣的海报—— 里氏替换原则海报 这一原则描述了: "子类型必须能够替换它们的基类。" 或者, 换句话说: "使用基类引用的函数必须能够使用派生类而无须了解派生类。" 同学:对不起, 这听起来让我觉得有点乱。我认为这个是面向对象编程的基本原则。这个叫做多态性, 对吧? 为什么面向对象设计原则需要考虑这个问题? 小卓:非常好的问题!这有一些答案: 在基本的面向对象原则中,"继承" 通常被描述成 "is a" 的关系。如果一个 "开发者" 是"软件专业人员",那么 "开发者" 类 应该继承 "软件开发人员" 类。这样的 "Is a" 关系在类设计阶段非常重要,但是这也很容易让设计者得意忘形从而以一个糟糕的继承设计告终。 "里氏替换原则" 仅仅是一种确保继承被正确使用的手段。 同学:我明白了,真有趣! 小卓:是的,确实如此。让我们来看看一个例子: 类层次结构图展示的是一个Liskov替换原则的例子。因为 KingFisher(翠鸟)类拓展(继承)了Bird类,因此继承了Fly()这个方法,这是非常不错的。   我们再来看看下面的例子: 修正过的Liskov替换原则的类层次结构图 Ostrich(鸵鸟)是一种鸟(显然是),并继承了 Bird 类。但它能飞吗?不能,这个设计就违反了里氏替换原则。 因此,即使在现实中看上去没什么问题,在类设计中,Ostrich 都不应该继承 Bird 类,而应该从 Bird 中分出一个不会飞的类,由 Ostrich 继承。 同学:好吧,明白了。我说说为什么里氏替换原则如此重要: · 如果不遵循 LSP原则,类继承就会混乱。如果子类实例被作为参数传递给方法,后果难以预测。 · 如果不遵循 LSP原则,基于父类编写的单元测试代码将无法成功运行子类。 我说的对吗? 小卓:完全正确,你可以设计一个对象并用LSP作为验证工具来测试该对象是否能够继承。 下一篇文章,我们将讨论“面向对象之接口隔离原则” 出处:开源中国 译者:K6F, 凡程子, 叫我蝴蝶吧, 王薇, 人头马没面, 铂金小龟, 风子, nikeff1108, sigai 链接:http://www.oschina.net/translate/how-i-explained-ood-to-my-wife?lang=chs&page=4# 了解更多软件开发常见原则问题欢迎登陆中软国际教育集团技术知识库!

更多>
软件开发培训:开闭原则丨穿衣服的例子

软件开发培训:开闭原则丨穿衣服的例子

2017-02-14

软件开发中经常需要注意的原则有哪些呢?开闭原则就是其中之一 “开闭原则“图示如下: 让我来解释一下,设计规则如下: “软件实体(类,模块,函数等)应该对扩展开放,对修改关闭。” 这意味着在最基本的层面上,你可以扩展一个类的行为,而无需修改。这就像我能够穿上衣服,而对我的身体不做任何改变,哈哈。 同学:太有意思啦. 你可以通过穿不同的衣服来改变你的外貌, 但是你不必为此改变自己的身体。所以你是对扩展开放的, 对吧? 小卓:是的。在面向对象设计中, 对扩展开放意味着模块/类的行为可以被扩展。那么当需求变化时我们可以用各种各样的方法制定功能来满足需求变更或者新需求。 同学:除此之外你的身体是对修改关闭的。 我喜欢这个例子. 所以, 对于核心模块或类的代码在需要扩展的时候不应该被修改。你能结合具体例子解释下吗? 小卓:当然了, 先看下面的例子.这个就不支持 "开放-关闭" 原则: 类的层次结构已经表明了这是违反"开放-关闭"原则的。 你看, 客户端类和服务端类都是具体的实现类。因为, 如果某些原因导致服务端实现改变了, 客户端也需要相应变化。 同学:有道理. 如果一个浏览器的实现和一个指定的服务器(比如IIS)紧紧的耦合在一起 , 那么如果服务器由于某种原因替换成了另外的 (比如, Apache) 浏览器也需要做相应的变化或者被替换掉. 多么恐怖的一件事啊! 小卓:非常正确!因为下面的将是一种好的设计方案: 类的层次关系展示了"开放-关闭"原则 在这个例子中, 添加了一个抽象的Server类, 并且客户端保持了抽象类的引用, 具体的Server类实现了这个抽象Server类。所以, 由于某种原因Server的实现类发生了改变, 客户端不需要做任何改变。   这里的抽象的Server类对修改关闭, 具体的Server实现类对扩展开放。 同学:我的理解是, 抽象是关键, 对吗? 小卓:是的, 基本上, 你要对系统的核心业务进行抽象, 如果你抽象化做的比较好, 很可能, 在扩展功能的时候它们不必做任何改变 (比如Server就是一个抽象的概念)。你所定义的抽象的实现 (比如, IIS服务器实现了 Server) 和抽象的代码 (Server) 要尽可能的多。这样在客户端代码中不需要做任何修改就会允许你定义一个新的实现(比如, ApacheServer)。 下一篇文章,我们将讨论“面向对象之里氏替换原则” 出处:开源中国 译者:K6F, 凡程子, 叫我蝴蝶吧, 王薇, 人头马没面, 铂金小龟, 风子, nikeff1108, sigai 链接:http://www.oschina.net/translate/how-i-explained-ood-to-my-wife?lang=chs&page=4# 了解更多软件开发知识欢迎访问中软国际教育集团技术知识库!

更多>
java程序员培训:为什么要用Spring(含三大框架简介)

java程序员培训:为什么要用Spring(含三大框架简介)

2017-02-09

Spring作为三大框架之一,一直困惑她有什么用?为什么要使用Spring呢?(大部分来自网上,引用出处太多,恕不一一标明。)。 SSH在J2EE项目中表示了3种框架,即 Spring + Struts +Hibernate。 Struts对Model,View和Controller都提供了对应的组件。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,可以应用在任何使用JDBC的场合,可以在Servlet/JSP的Web应用中使用,也可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Struts2原理就是用拦截器,使得你客户端发送的请求都被拦截下来后处理。拦截器用到了反射机制。Struts2主要的功能是控制转发,在于Action的处理,和struts.xml配置。 Spring其实包含了很多的知识,用到的有IOC,AOP等,其实就是一个管理框架的容器,你不用再考虑你new对象了,它会帮你做,降低了层与层之间的耦合度。Spring里面有很多的思想,IOC就是控制反转,注入。AOP是面向切面的,有点像拦截器。 Hibernate是持久层框架,我们平时用JDBC操作数据库要写SQL语句,有时候字段一多会很麻烦,于是用hibernate就很方便了,你只要熟练掌握里面的映射关系,就不用写sql语句了,它会帮你写,API调用一下很方便的。 Struts 1.Struts框架结构 Struts对Model,View和Controller都提供了对应的组件。 在右图中,ActionServlet,这个类是Struts的核心控制器,负责拦截来自用户的请求。 Action,这个类通常由用户提供,该控制器负责接收来自ActionServlet的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。        2.Model部分 由ActionForm和JavaBean组成,其中ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionForm里面的请求参数处理用户的请求。 JavaBean则封装了底层的业务逻辑,包括数据库访问等。        3.View部分 该部分采用JSP实现。 Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。对应上图的JSP部分。        4.Controller组件 Controller组件有两个部分组成——系统核心控制器,业务逻辑控制器。 系统核心控制器,对应上图的ActionServlet。该控制器由Struts框架提供,继承HttpServlet类,因此可以配置成标注的Servlet。该控制器负责拦截所有的HTTP请求,然后根据用户请求决定是否要转给业务逻辑控制器。 业务逻辑控制器,负责处理用户请求,本身不具备处理能力,而是调用Model来完成处理。对应Action部分。        Spring 1.简介 ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 ◆范围:任何Java应用 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。        2.轻量 从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。 此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。        3.控制反转 Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。        4.面向切面 Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。 应用对象只实现它们应该做的——完成业务逻辑——仅此而已。 它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。        5.容器 Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。 然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。        6.框架 Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。        Hibernate 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。        2.Session接口 Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。        3.SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。        4.Configuration接口 Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。        5.Transaction接口 Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。   6.Query和Criteria接口 Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。   作者: weibo_尉广明大将军_0 链接:http://www.imooc.com/article/7283 来源:慕课网 了解更多java程序员入门知识欢迎登陆中软国际教育集团技术知识库!

更多>
JAVA程序员培训:如何防止代码腐烂

JAVA程序员培训:如何防止代码腐烂

2017-02-09

 今天这篇文章清晰的分析了代码腐烂问题的原因及解决方法,希望可以对你有所帮助。        让我们先看一个人的情况。 了解更多java程序员学习内容欢迎访问中软国际教育集团技术知识库!

更多>
Java发展空间依然很大 JAVA就业培训需求旺盛

Java发展空间依然很大 JAVA就业培训需求旺盛

2017-02-08

   Java正在改变着全世界的生活。全球有30亿Java器件运行着Java,500多万Java开发者活跃在地球的每个角落,数十亿计的Web用户每次上网都亲历Java的威力。实际上,JAVA是一个发展迅速的新兴行业,Sun公司以及IBM、Oracle、Netscape等公司都在大力推进Java的应用。Java在WWW应用中的地位得到肯定以后,Java的应用有向更广阔的领域扩展的趋势,作为一种语言,Java在过去十年中取得了其他任何语言都无法比拟的成绩。Java的前程不可限量。  据权威预测,至2013年,中国将新增15000家IT企业。强势增长拉动了该行业对IT人才的需求,未来发展中,JAVA将成为IT从业者必须掌握的一门语言。不管你对Java是怎样一个态度,有一点不可否认,Java是现在全球最时髦的开发工具之一,也许现在还无法准确评估Java为整个IT业带来的影响,但是有一点却毋庸置疑---Java将不可避免地影响一代程序员。  为什么Java发展空间仍然大? Java有三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME),J2SE就是Java的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入式系统开发,如手机、PDA、家用电器等方面的编程;J2EE则应用于大量的企业级应用,如网站、ERP系统等。其中以J2EE和J2ME应用最为广泛。目前Java的这三大体系在全世界众多的领域应用最为广泛,无论是政府、军事、科研还是企业,就连我们买的智能机其实也都是java机,android的发展更是带动JAVA往移动方面的拓展。过去和现在,Java越来越火,将来势必也发展的更好。 JAVA就业培训市场发展前景广阔  现在人们愈发相信,在今后的十年、二十年之内,Java都将是IT行业最炙手可热的技术,Java软件工程师将持续成为最热门的岗位之一,历史也不断的证明,JAVA的发展越来越好。这不但被广大的程序员和计算机人士看到,许多的培训机构也早已尝到了Java培训的甜头,在过去的7年终,一个又一个IT培训机构靠Java培训发家致富,一个又一个Java培训讲师走到台前,被广大的大学生们及java新手所熟知。时至今日,Java培训仍然是IT培训中最火的培训之一。不过,儿童级别打打闹闹的初级培训已经不再具备市场,从近2年及今后若干年,Java培训的发展前景将依靠于就业培训,只有以实实在在就业为导向的培训才能经得起市场的考验。

更多>
JAVA入门学习:JAVA程序知识库

JAVA入门学习:JAVA程序知识库

2017-02-07

1、final, finally, finalize的区别。 final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 3、sleep() 和 wait() 有什么区别? sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。 wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 4、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 5、error和exception有什么区别? error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 6、abstract class和interface有什么区别? 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。 7、JSP有哪些内置对象和动作?它们的作用分别是什么? JSP共有以下9种基本内置组件: request用户端请求,此请求会包含来自GET/POST请求的参数 response网页传回用户端的回应 pageContext网页的属性是在这里管理 session与请求有关的会话期 applicationservlet 正在执行的内容 out用来传送回应的输出 configservlet的构架部件 pageJSP网页本身 exception针对错误网页,未捕捉的例外 常用的组件:request、response、out、session、application、exception 8、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 9、说出数据连接池的工作机制是什么? J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 10、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。 用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。 throw语句用来明确地抛出一个"异常"。 throws用来标明一个成员函数可能抛出的各种"异常"。 Finally为确保一段代码不管发生什么"异常"都被执行一段代码。 可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。

更多>
新手程序员如何做到"编程速度又快,Bug 数量又少"?

新手程序员如何做到"编程速度又快,Bug 数量又少"?

2017-02-07

三个程序员被要求穿过一片田地,到达另一侧的房子。 菜鸟程序员目测了一下之间很短的距离,说:“不远!我只要十分钟。” 资深程序员看了一眼田地,想了一会,说:“我应该能在一天内过去。”菜鸟程序员很惊讶。 大神程序员看了一眼田地,说:“看起来要十分钟,但我觉得十五分钟应该够了。” 资深程序员冷笑了一声。 菜鸟程序员出发了,但只过了一会,地雷爆炸了,炸出了巨大的洞。这下他必须偏移预定的路线,原路返回,反复尝试穿过田地。最后他花了两天到达目的地,到的时候颤颤发抖,还受了伤。 资深程序员一出发就匍匐前进,仔细地拍打地面,寻找地雷,只有在安全的时候才前进。他在一天的时间内小心谨慎地缓慢爬过了这片地,只触发了几个地雷。 大神程序员出发之后径直穿过了田地,十分果断。他只用了十分钟就到了另一边。 “你是怎么做到的?”另外两个人问道,“那些地雷怎么没有伤到你?” “很简单,”他回答道,“我最初就没有埋地雷。” 当我们遇到我们(或其他人)给自己埋下的逻辑炸弹,编程会变得很困难。我们天天在编写逻辑炸弹。它们就在地表下静静地待着,等着爆炸。一旦爆炸,通常就带来不可预测的严重后果。 随着新的代码模块被加入到项目中,项目的复杂度会上升。这种上升不是线性的,而是呈某种指数形式。 程序员的精力是一种有限的资源,所以这种爆炸式增长的复杂度最终会淹没程序员。你的大脑最终会不堪重负,这是一个转折点。 这就是炸弹开始爆炸的时刻。有各种各样的炸弹:在遍历时修改数组,数组下标偶尔变成负数,另一个线程在你的函数执行的起点和终点中间改变对象的状态。轰,轰,轰…… 我认为最快捷可靠的程序设计需要培养一种避免这些问题的风格。 编写明确表达行为的代码。选择有意义、准确、无歧义的符号名字。严格执行命名方案,不要用不同的单词描述同一个事物。 如果有,采用最简单的解决方案。不要为速度优化,而是为可读性和透明度优化。 如果你在最初编写代码时没有注意可重用性,不要欺骗自己相信代码可以很神奇地被重用。相反,应该从一种情形着手,保持代码的具体性。如果值得修改代码让它一般化,那么应该做好彻底重写的准备。 了解更多新手程序员入门知识欢迎登陆中软国际教育集团技术知识库!

更多>
前端开发入门丨展示更灵活,自适应的几种思路

前端开发入门丨展示更灵活,自适应的几种思路

2017-02-04

多终端是大势所趋,而不管是哪个终端上显示的页面,本质还是一样的。如何尽可能的减少实现成本来适应丰富多样的分辨率呢?希望小卓的这个分享能给大家一些思路。 首先呢来看一张图: 这是2个半月腾讯游戏官网的分辨率数据,可以看出来PC端里1024*768占20%、1920*1080占14%。而这2个分辨率的显示宽度相差了接近一倍。 而现在设计师的设计稿普遍输出尺寸都是1920,所以设计师经常也会担心:小分辨率下能看到吗?或者需要为手机端单独做一版吗?所以我们需要用一些技巧来让大多数用户能看到的页面效果是一样的。 PC端 我们来先看一个例子: 设计的很美观 但是如果直接按原始大小做,小分辨率玩家只能看到中间的人物而已。 经常我们做全flash站的时候,会看到多媒体的同学会为了配合多分辨率做展示上的自适应。 而重构其实纯靠css也可以实现同样的缩放自适应: 这样不会因为分辨率小而只能看到中间一个区域,或者出现滚动条影响体验。 实现思路: 1: 针对IE:IE有个zoom属性。虽然经常我们用它来清浮动什么的。但是它在缩放元素上也是很强大的。eg:被设置zoom:0.5的元素会以该元素的左上角为原点在直接被缩小一半,所占据的文档流内体积也会减少一半(IE7和8+对zoom后的元素的margin值理解不同可以注意下,不过单纯缩放元素时不太需要用到)。firefox下呢,就可以使用css3的transform:scale()。(需要额外设置transform-origin:0 0为缩放原点)。 2:另外zoom也被webkit支持,scale还是zoom请自行选择~ 3:接下来我们就可以按设计稿直接切成成一个巨大无比的1920*1000的页面。 4:然后获取用户的当前窗口尺寸,eg当前窗口宽1200,那么我们需要缩放的比例 zoom=1200/1920=0.625。然后把我们的主显示的父框缩小0.625倍就可以啦~(当然为了高度不出滚动条,高度的尺寸也要纳入计算范围) 是不是很简单呢?以后遇到会影响内容浏览的大页面的时候 可以考虑用这种方法做一个缩放哦~ 好啦,PC端的显示器适配先分享到这里,咱们再研究一下移动端和PC端如何实现同时适配! 移动端 移动端虽然整体尺寸小+倒下去竖起来的尺寸差别太大,但是本质和PC端页面没什么区别。 常见的自适应自然就是: 1. 响应式,media queries配合百分比让页面内容自然的去适应。 2. 根据浏览器尺寸然后进行动态的定位。 如果单独做手机端的页面,用上述方法做自然正常显示不是问题,但是当时间紧任务重或者资源不够需要PC和手机使用同一套页面时,如何适应手机就是个需要考虑的问题了。 我们来看看例子: 打开会发现这就是一个正常的PC端的活动页面,但是因为从策划到上线的时间都非常紧没有时间为手机版单独做一套,所以就要考虑如何能适应手机浏览了。 因为这个活动系列其实是拉数据后趣味展示(其实就是定位图片和文字在页面上),所以定位和宽度用百分比进行后很可能在显示的时候出问题;字体可能因为分辨率小的时候换行;甚至页面的背景和高度在适应多分辨率的手机时也不易控制等等等等(我纠结了一堆的忧虑)。怎么办?咳~聪明的你一定想到了,嗯~就用我们PC端的第一个例子,缩放搞定!         本文来源:W3CFuns

更多>

推荐阅读

更多

中软卓越java培训地址:北京市海淀区科学院南路2号融科资讯中心C座北楼12层 联系电话:400-666-3775 邮箱账号:etc-marketing@chinasofti.com

©2008-2016 北京中软国际教育科技股份有限公司 京ICP备14058756号-2