instanceof

没有评论

2010 年 12 月 07 日 at 下午 9:11分类:PHP | WEB开发

instanceof是Java的一个二元操作符,和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。可以用在继承中的子类的实例是否为父类的实现。 用法: result = object instanceof class 参数:result 变量(必选项):object 已定义的对象类(必选项):class 说明:如果object是class的一个实例,则instanceof运算符返回true。如果object不是指定类的一个实例,或者object是null,则返回false。 我个人理解的一个应用场合就是,当你拿到一个对象的引用时(例如参数),你可能需要判断这个引用真正指向的类。所以你需要从该类继承树的最底层开始,使用instanceof操作符判断,第一个结果为true的类即为引用真正指向的类。 例如下面的例子:

     class Person{}
     class Student extends Person{}
     class Postgraduate extends Student{}
     class Animal{} 
     public class InstanceofTester {
             public static void main(String[] args) {
              instanceofTest(new Student());
             }
    public static void instanceofTest(Person p){
     // 判断p的真正类型
     if (p instanceof Postgraduate){
            System.out.println("p是类Postgraduate的实例");
     } else if(p instanceof Student){
            System.out.println("p是类Student的实例");
     } else if(p instanceof Person){
            System.out.println("p是类Person的实例");
     } else if(p instanceof Object) {
            System.out.println("p是类Object的实例");
     }
  /*if(p instanceof Animal){//此错编译错误,所以做注释
   System.out.println("p是类Animal的实例");
  }*/
 }
}

这个程序的输出结果是:p是类Student的实例
Person类所在的继承树是:Object<–Person<–Student<–Postgraduate。 这个例子中还加入一个Animal类,它不是在Person类的继承树中,所以不能作为instanceof的右操作数。

欲擒故纵之高效编程

没有评论

2010 年 12 月 07 日 at 下午 4:59分类:乱七八糟

昨天我做了一些事情使我的编程效率提高了一倍。简单,容易,但使我的生活发生了巨大的变化。

  你们中可能有些人已经知道我是怎么做的。对于其他的人,这听起来有些疯狂。

  我不持续工作。

  或者,我把定时器设置成50分钟,在此期间我只干一件事 — 没email,没聊天工具,没游戏,没分心的事。50分钟后,我去散步。

  它使我效率增倍。而且作为一个副作用,它使我的工作更加快乐。

  我知道你们中的很多人在想什么。无论何时这个(或其它特别的Pomodoro技巧)被提及时,我都会听到各种的常见的怀疑声。

  那就让我们一一看来:

  这样做不会使我的注意力不能集中在我正要努力解决的难题上吗?很奇怪,跟你的直觉相反,不会。当你做其它的事情来放松你的神经时,你的大脑却仍然在思考你的问题。很多次,思路豁然开朗,把很多一直都无法解决的难题都解决掉了,这是因为你开始从远处观察这个问题,在大背景下,而不是紧紧的死揪着某处。

  你是怎么停下来的?当我编程时我从来不看表。昨天我使用的是微波炉的定时器,但我工作效率上的变化使我大为震惊,我买了一个秒表,就是上面图中的那个。

  我的生活中有太多的各种各样的打搅我的事情,邮件,聊天工具,电话短信。你的方法对我不管用。我有个原则:在我的工作时间里不允许有分心的东西。当我休息完后,我会花几分钟把这种分心的事情处理掉:检查邮件,回复聊天软件里的消息,回电话。当把这些事情全做完后我才开始启动定时器。

  看起来它会给我的生活带来不必要的压力。的确会,但却是积极性质的。我发现自己急切的想知道在每个工作时间段里 能究竟能做多少工作。我不由的开始把工作细化成更小的模块,催促自己看是否能在这时间段里完成这个模块。但这没有压力。我有个更好的词来描述督促自己把工 作完成的更好更高效的现象:愉快。我很愉快。它把难题变成了游戏。

  工作后你会用多长时间来休闲? 我不知道。这难住我了。我会去散步 — 一个足够长的散步,至少10分钟。有时我会到阳台上,吃个橘子,听听大自然的声音。有时我会把秒表倒计时10分钟,以免我回来的太早。

  在休息时间我可以做任何想做的活动吗? 我想不能。我觉得你必须只做一种活动,让你大脑闲置的活动。散步,乒乓,玩乐器,发呆,打盹。考虑那些温和的、有目标挑战的活动 — 特别是户外的 — 效果会更好,但这只是我的猜测。

  这里有什么秘密? 秘密,以我个人的见解,是当你强迫大脑释放缠绕很久的问题时,潜意识里会使它缠绕的更紧:你的大脑强烈希望回到问题上。于是它会一直研究它,思考它。你越 使你的大脑从工作上拽走,它就越强的返回到工作中。越是特意的停止工作,你越更多的投入到问题中,你把思想带离工作越远,思想会越想回去。这比起你死盯着 电脑屏幕/敲出一堆垃圾代码来,你的大脑会更有效率的多。退一步,海阔天空。我可以保证,当你又重新回到座位上坐下来时,你会有各种更好的该怎么样做的想 法。就像是有一个小程序、设计评审程序,当你在玩乐时,在你的大脑深处后台运行,帮你思考问题。

  如果你非常的聪明,怎么会想到要依赖这样的做法? 这个嘛。这里我的故事要转向说一下坏的事情:我过去做事情也是这样“玩玩干干”!事实上,我的工作时间和娱乐时间的分配已经无法控制。我以前编程就像是在受煎熬。我决定要改变。

  为什么?因为我发现当浏览器变得越来越友好,计算机变得约来越使人分心时,我开始在潜意识里把计算机的娱乐功能和工作功能混淆在一起了。我工作一会儿,就去看看骇客新闻,再去读几篇有趣的文章,然后再工作一会儿,然后写几条评论,然后看看邮件,等等。

  回头一想我在做什么?很显然:我正在拿各种各样新鲜刺激的事物过程来轰炸我的大脑。我的大脑不能工作在我的“主要”问题上,因为我忙着来回折腾在数 十个不同的产生刺激因素的事物过程中。事后你会发现这最后的结果是把一心只放到一件编程事情上的情况转变成一心放在了很多事情上,而这些事情都跟编程没有 关系。如果你喜欢使用计算机进行娱乐活动,你可以在工作前,午餐时,或工作休息期间。我越观察现代的计算机活动,我越相信计算机功能繁多、使娱乐更方便的 性质已经严重的跟它作为一种能够生产工作的机器的用途相抵触了。几年来,我甚至慢慢的停止了赛场运动,约来越多的时间“沉浸”在了计算机世界里。这对你的 大脑不是件好事,请相信我。

  这是一个很简单的事情,你也许会很难想象到它会有什么用处。但请给自己一次机会 — 谁能预料你会有什么发现呢?

  作为一个边注,从所有的这些事情,我发现物理的把你的电子设备按功能分离开也许是另外一个能提高你的工作效率的好方法。

有10种方式可以搞砸你的代码

没有评论

2010 年 12 月 07 日 at 下午 4:55分类:WEB开发 | 乱七八糟

写代码是一个富有创意但又可能让人思想麻痹的任务,不管你是否喜欢你的工作,你总会找一些捷径,但遗憾的是,大部分捷径都违反了最佳编码实践原则,这些捷径要么会产生BUG,要么会导致数据出错,我的建议是:在编写VBA代码时,不要走捷径。下面是一些常见的错误观念,导致人们选择了错误的捷径,虽然其中一部分只适用于VBA或某种IDE,但大多数都是通用的。

  1、我不需要else子句

  If…then…else,select case等VBA语句都包含了else子句,这个子句后跟随了所有具体的决策条件,这是处理一些带条件事情的最好机会,但开发人员却忽略了这个机会,并认为没必要这么做。包括一个else子句并不难,并且还可以提供一层额外的错误捕捉机会,你可以显示一般性错误,让用户知道预期的决定或行动不会发生,或是通过日志记录下来,用电子邮件发送给管理员或内部开发人员,总之想让事件引起注意,一个未执行的else子句比多个选择更好。

  2、goto是一个有效的语句,我经常使用它

  Goto是一个有效的语句,但使用不当会产生难以驾驭的代码,而且会隐藏错误和拙劣的程序设计,当你不能想出一个更好的策略时,不要轻易使用goto语句,当你真正需要一个简单的重定向程序流时可以使用它,每次敲下goto时都问一下自己,是否有其它方法来处理这个重定向?如果有就不要使用goto(我在VBA开发中就从未使用过goto语句)。

  3、编译器是在浪费时间

  和其它编译器不同,VBA编译器不会生成一个可以脱离Office独立执行的模块,相反,VBA编译器实际上是一个语法检查器,在真实运行之前,编译你的代码是捕捉语法错误简单有效的方法,你为什么要这么做呢?因为语法检查器通常提供更深入的错误信息,因此你可以更快地解决问题。

  4、无任何错误需要处理

  大多数开发人员还没有自信到自己的代码是完美无缺的,但大多数人对错误处理都会掉以轻心,错误处理和你的设计和逻辑一样重要,不要放弃它,相反,在处理错误时应当特别小心,一个未处理的错误通常意味着程序投入使用后,你会接到更多的支持电话,也许程序因这个错误而停止了工作,也许它导致了数据异常,在处理错误时,你可以:

  ◆与你的用户分享一些信息,包括立即纠正错误的说明。

  ◆帮助程序立即从错误中安静地回复,用户永远也不会知道程序曾经发生了错误。

  ◆跟踪错误,以便你进行修复。

  5、我的用户将输入正确的数据

  如果程序正常运行需要依赖用户的准确输入,这将是风险很大的一件事,这不是对用户能力的质疑,用户都不是傻子,但确保程序正常运行并不是他们的本职工作,你不能依赖他们输入正确的数据,相反,你应该从技术上来验证用户的输入,你可以使用表属性从底层来约束和验证,但大多数时候还是要靠你写的代码来验证,这也许是程序基本功能代码完成后最重要的任务,因此不要吝啬你的代码,不能依靠用户不犯错误的输入,你应该坚定地拿起验证程序捕捉错误并纠正它们。

  6、认为带前缀或标签的命名约定不好

  你在创建一个变量时,能通过数据类型和用途识别它是最好的,大多数VBA开发人员喜欢添加3个字符的前缀,或标签来确定数据类型,例如,用于存储姓氏的字符串数据类型可能命名为strLastName,前缀确定了变量的数据类型,LastName确定了变量的用途,有些开发人员认为这个前缀是没有必要的,甚至会造成干扰,因此他们不使用前缀,在某些情况下,数据类型的确是显而易见的,但有时却不那么明显,添加前缀或标签不会增加工作量,但它的好处却有很多,如:

  ◆标签是自文档化(self-documenting)的。

  ◆在调试或修改代码时,你可以立即知道变量的数据类型。

  ◆在投入生产几个月后,你也许早已记不得那些变量的含义了,或者你已经离开,后来的维护者在前缀或标签的提示下,能更快地读懂代码。

  7、不会有任何空值

  无论你采取什么措施,空值总是带有破坏性,如果你正确地处理空值,程序将会更稳定,VBA提供几种工具来发现和处理空值。

  ◆使用IsNull()确定一个表达式或值是否为空,你不能对空值使用比较操作符,如var=Null或var<>Null,直接比较总是返回空(T-SQL有时会返回False)。

  ◆在Access中,遇到Null时,Nz()返回一个值,而不是Null。

  ◆如果你需要处理Null变量,请使用Var数据类型,它是唯一可以存储Null的数据类型。

  8、我是唯一一个使用应用程序的人,因此我在程序中嵌入了密码

  密码和用户id值永远都不应该嵌入到代码中,你可能是唯一被授权使用该应用程序的人,但这并不意味着就可以直接将密码嵌入到程序中,相反,不管是谁要使用这个程序,都应该提供一个对话框让其输入登录凭据。

  9、我写代码时就做了测试,不用再测试了

  当你写代码时就做了测试,这很好,但这样做是不够的,开发人员通常不适合测试自己写的代码,他们不会把自己想象成用户,因此很难发现重大BUG,往往是走走过场罢了,要知道最终是要把程序投入生产环境,那时就不是你自己使用了,因此应该找一些最终用户来测试。

  10、就我一个人开发,我只写代码,文档就免了

  如果就你一个开发人员,也许你不会写文档,你认为那只是耽误自己的工作,但大多数开发人员在修改非自己写的代码之前,都希望有良好的文档参考。别的不说,至少下面这些内容应该有文档记录。

  ◆例行的目的/任务/目标。

  ◆传递的值和参数的简短定义。

  ◆对一些非常规的代码写法,附上解释和想法。

  ◆谁创建的代码,谁在什么时候修改过代码,修改了哪些内容,当你离职后,其他接收的人看到良好的注释一定会从心底敬佩你。

程序员,架构师有话对你说

没有评论

2010 年 12 月 07 日 at 下午 4:32分类:WEB开发 | 乱七八糟

六个月前,当我们开始新项目时,我和我的团队里的每个人都收到了来自我们的架构师的一封邮件:

  每次当我开始做一个新项目时我都非常的兴奋。即使是在做了20年的软件开发后,我仍然感觉心里像揣了一个小兔子似的怦怦直跳。这将是我们共同的旅程。我深信我们正在绘制一份充满乐趣、富有挑战、内容丰富的路线图。我想让这趟旅程能够成为你们将来值得回忆的一件事,希望你们都能完全的体验到这次经历。

  这有点理想化,但我会尽量使公司的议事日程、技术策略和你们的进展协调一致。这样一来,如果你们做的很好,大家都会受益。我对你们技术工程师们和开发出的代码怀有深深的敬意。

  1. 程序就是一切。文档是紧接其后的事情。因此,把你们的代码写成本身就是文档,而且要好用。

  2. 测试 测试 测试。

  3. 单元测试要严格。任何一个单元测试中发现的bug都负担了开发人员成本外的双重代价。你们要知道,我宁愿给你们更多的薪水也不愿找别的QA公司来测试、让你们修改bug。但如果你的程序写的很差,那我只好把这些钱由这些人平摊,你们只能得到其中很小的一块蛋糕。

  4. 写出好代码要能给人类阅读,给CPU使用。绝对不能向烂代码低头。

  5. 阅读更多的知识,不要局限于目前的工作所需。如果你只掌握今天需要的知识而不知明天需要的,你不会有发展进步。

  6. 回家不时的做做饭。是的,真的饭。这会让你知按照菜谱做饭和自己创造一顿饭之间的区别。前者是在做饭前已经知道了需要什么,而后者是根据你目前有的来做 … 就这一点点不同。

  这是我创业的最大的一个体会。它来之不易。

  7. 新思想和好主意(技术或产品)随时随地都会产生。请和我们分享。

  8.知道你们都讨厌业务人员。我明白为什么。他们要卖你们不能制造的东西;他们承诺但不兑现;他们不给钱却想要更多的东西。但一个公司的运行少不了他们,需要他们给产品定位。这是个很难的活。但请把你们的想法告诉我,我将会扮演一个缓冲区。要想做好一个公司,所有的纪律都不能少。

  9.热爱你技术人员的职业。你可以在技术/开发这个角色上做一辈子,并且挣很多钱,获得尊重,获得快乐。

我们在领会 …