您现在的位置:首页
--> 编程语言
本文并不是想教会你如何编程,而是想告诉你,编程是一件十分简单的事情,但是想写出好的程序却是一件无比有难度的事情,这需要你想出足够好的算法,同时也需要你对程序的执行环境有基本的了解,知道怎么写程序跑的快、怎么写程序会很卡,等等。
当然,作为程序员最苦恼的事情,并不是编程本身,而是需求的变化。比如当你做好了这顿饭,却发现家人在外面吃过了,此时的你就只能含着泪,一个人吃完这桌难以下咽的饭菜了。
Go reflect包提供了运行时获取对象的类型和值的能力,它可以帮助我们实现代码的抽象和简化,实现动态的数据获取和方法调用, 提高开发效率和可读性, 也弥补Go在缺乏泛型的情况下对数据的统一处理能力。
通过reflect,我们可以实现获取对象类型、对象字段、对象方法的能力,获取struct的tag信息,动态创建对象,对象是否实现特定的接口,对象的转换、对象值的获取和设置、Select分支动态调用等功能, 看起来功能不错,但是大家也都知道一点: 使用reflect是有性能代价的!
从 VB.net、Java、C# 和 Python 开始转到 Go开发的时候,我对Go语言层级的模式的缺乏有点懊恼,这促使我花了一点时间找出容易表达的那些模式。
这里是一些通用的模式的集合,以及我发现的最容易表示它们的方式。
多语言编程环境是一把双刃剑,既带来好处,也带来可能威胁组织的复杂性。
如今,随着各种不同的编程语言的出现,许多组织已经变成了数字多语种组织digital polyglots。开源打开了一个语言和技术堆栈的世界,开发人员可以使用这些语言和技术堆栈来完成他们的任务,包括开发、支持过时的和现代的软件应用。
与那些只说母语的人相比,通晓多种语言的人可以与数百万人交谈。在软件环境中,开发人员不会引入新的语言来达到特定的目的,也不会更好地交流。一些语言对于一项任务来说很棒,但是对于另一项任务来说却不行,因此使用多种编程语言可以让开发人员使用合适的工具来完成这项任务。这样,所有的开发都是多语种的;这只是野兽的本性。
多语言编程环境是一把双刃剑,既带来好处,也带来可能威胁组织的复杂性。
如今,随着各种不同的编程语言的出现,许多组织已经变成了数字多语种组织digital polyglots。开源打开了一个语言和技术堆栈的世界,开发人员可以使用这些语言和技术堆栈来完成他们的任务,包括开发、支持过时的和现代的软件应用。
与那些只说母语的人相比,通晓多种语言的人可以与数百万人交谈。在软件环境中,开发人员不会引入新的语言来达到特定的目的,也不会更好地交流。一些语言对于一项任务来说很棒,但是对于另一项任务来说却不行,因此使用多种编程语言可以让开发人员使用合适的工具来完成这项任务。这样,所有的开发都是多语种的;这只是野兽的本性。
装饰模式,动态地给一个对象增加一些额外的职责 ( Responsibility ),就增加对象功能来说,装饰模式比生成子类实现更为灵活。
code review中一些小结, 还没来得及加例子, 简要记录, 供参考:
一: 一切都与复杂度有关
二: 代码应当易于理解
那天有用户向我反馈在使用 GoJieba 的过程中发现内存泄露的Bug。 具体现象就是这个测试代码 test.go 跑着跑着内存一直增长。 刚开始以为是代码里面的C语言部分内存没有正确释放导致的, 查了很久一直没有找到问题所在。
最后发现这个Bug非常白痴,是因为 C.CString 使用不当导致的。 在调用了 C.CString 之后需要手动释放内存。 这个Bug非常白痴,但是却反映了我之前对Go语言string理解不彻底的隐患。 才导致在我第一眼看到 C.CString 的时候, 就下意识的认为这个函数肯定没有动态申请新的内存, 和 C++ string::c_str() 一样,复用了内存。 所以也就肯定不需要手动释放。 当然这些只是『我以为』。
关于编程语言的类型系统其实很复杂,我已经写得很费劲了,但是毕竟火候不行,还有一些重要或者深入的东西没有提到。另外,这也不是教程,只是按照特性的比较和整理,如果要系统学习Groovy或者Haskell,还是需要寻找相应的教程,通常在官网上的资料就很不错。
我记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会:
1、学习和使用什么编程语言不重要,重要的是算法和设计;
2、程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通。
Lua 作为一门嵌入式语言,提供了完备的 C API 供 Lua 代码和宿主程序交互,当然,宿主语言最好是 C 或 C++ 。如果是其它语言,比如最近两年流行的在 mono 环境嵌入 Lua 另当别论。
正确将 Lua 嵌入是不太容易做对的事情,很多刚接触 Lua 的人都容易犯错误。好在做这种语言桥接工作都是项目开始阶段的设计者做的,不必人人学会,所以只要有熟悉 Lua 的人来搞,犯错误的危害不会太大。而且即使做的有问题,日后修改也比较容易。这篇 blog 主要就是谈谈,最容易做错的位置,和一些正确(但看起来麻烦)的实现方法。
因为中文的 Scheme 的资料其实很少,所以顺便把自己学习的过程和一些体会整理记录下来,算是作为备忘。本文只涉及 Scheme 里最基础的一些语法部分,要是恰好能够帮助到后来的学习者入门 Scheme,那更是再好不过。
本篇文章的话题是元编程。首先来认识元编程,我在第一篇《引子》里面已经介绍:元编程,指的是在运行时改变“类”的定义,例如访问、增加或修改等等。一言以蔽之,就是“用程序来写程序”。在第二篇的《类型系统》里面已经借由继承和接口的实现,介绍了一些利用元编程特性来增加或改变子类行为的方法。回顾语言发展的长河,其实是经历了一个从“对象 -> 类 -> 元类”到“对象 -> 原型”的发展过程的。所以,无论是类,还是元类,这样的概念其实都不是非有不可的,只是因为我们思考的习惯,特别是抽象的习惯而顺其自然地产生了。
将数组转化为列表 将数组转化为一个列表时,程序员们经常这样做......
无论是在以前的团队,还是在现在的团队,都有人主张抽象出所谓的Service层,他们认为Model只负责跟数据库沟通,不应该混杂过多的东西,而同样也不赞成在Controller的Action里面,做太多事情,那样不利于复用。而他们赞成的方案,就是『抽象』出一层所谓的Service层,从而实现代码的复用。
而我通过观察他们具体的实现的代码,发现,这是一个很糟糕的想法。因为很少有人能忍住诱惑不去滥用。
在PHP里面,public static function其实就是最最原始的函数式编程模式的全局函数而已。任何一个软件里,如果全局函数满天飞,肯定不是一个『抽象』优秀的系统。如果不是绝对克制,那程序员会忍不住在任何地方,调用全局函数,甚至,只要一能复用代码,就忍不住去调用一下全局函数,得到好处后,就会进一步把更多的东西变成全局函数,而最后发现,所有的业务逻辑都在全局函数里了。
我们知道大部分编程语言中的数组都是从0开始编号的,即array[0]是数组的第一个元素。这个和我们平时生活中从1开始编号的习惯相比显得很反人类。那么究竟是什么样的原因让大部分编程语言数组都遵从了这个神奇的习惯呢?本文最初是受stackoverflow上的一个问题的启发,通过搜集和阅读了一些资料在这里做个总结。当然,本文摘录较多的过程结论,如果你想把这篇文章当做快餐享用的话,可以直接跳到文章末尾看结论。
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [65] IOS安全–浅谈关于IOS加固的几种方法
- [62] 如何拿下简短的域名
- [61] android 开发入门
- [61] Oracle MTS模式下 进程地址与会话信
- [61] Go Reflect 性能
- [58] 【社会化设计】自我(self)部分――欢迎区
- [57] 流程管理与用户研究
- [57] find命令的一点注意事项
- [57] 图书馆的世界纪录
赞助商广告