Arganzheng's Blog

stay hungry, stay foolish

关于面向对象与面向过程的一些思考

这几天看python,python支持面向对象编程也支持面向过程编程,就像C++一样。其实我不是很喜欢提供太多编程范式的语言,因为灵活性往往带来相应的复杂性,C++就是一个典型的例子。 对于一个提供了面向过程和面向对象编程范式的语言,很有必要知道两者的区别。 面向过程编程 使用面向过程编程,我们一般将完成同一个大功能的所有函数放在一个文件中,如一个命名为file的文件,这个文件提供所有对文件的操作。然后我们会发现该文件中的所有函数基本都含有fileId这个参数,因为所有文件操作,除了打开文件(open),都需要这个文件标识符以知道它要操作的文件。 如果某些函数我们只是内部使用,在C中我们使用static修饰符,将其作用域局限在该文件中。 面向对象编程 如果...

语言进化论

到现在,学过的语言真是多不胜举:C、C++、Java、C#、JavaScript、Shell、Perl、Python、Ruby…。这么多的语言,学都学不完。但是这些语言之间的差异其实也不是特别大。个人感觉对程序员最大的变化就是编程思想。 我觉得语言无非就是告诉计算机应该怎样去完成一件事(描述动作),那么只要你理清楚作这件事情的步骤,就很容易将这件事情描述清楚。至于这些步骤应该如何完成,具体语言的实现可能不同,有些语言实现起来简单,有些复杂,但是终究是可以完成的(比如某个步骤需要使用到Map数据结构,但是C语言就没有,所以要自己搞一个)。这就是为什么很多算法书很喜欢用伪代码来描述算法,就是要做到语言无关。 我自己在编程的时候,也是很喜欢先写步骤(通过注释的形式,另...

关于接口设计的一些思考

引子 做维护型工作,最大的收获也许就是知道什么叫做丑陋了。本文针对我遇到的一些接口设计问题,总结了如下一些经验分享给大家,希望我们能够吸取经验,对外提供最美的一面,即使我们的实现可能很丑,但是用户不关心也看不到,这就是封装的好处,哈哈。 1. 关于接口的粒度——应该提供应用无关的细粒度接口和应用相关的粗粒度接口 接口的粒度其实很大程度上是接口的职责问题。一般来说越细粒度的接口职责越内聚(偏向于Service),越粗粒度的接口职责越宽泛(偏向于Facade)。 笔者认为下面的做法是比较合理的: 对上层应用应该尽量提供粗粒度的接口,可以而且很多情况下是应用相关的。好处在于 提供更方便简介的接口,屏蔽多接口的协作细节。 避...

-exec和xargs的区别

当你在命令行执行: $find . -name 'core' -type f -exec rm {} \; 时,find -exec 命令会对每个匹配的文件执行一个单独的rm操作(execute a separate rm for each one), 正如你手动敲入下面命令: rm ./bin/core rm ./source/shopping_cart/core rm ./backups/core ... 但是使用这种方式,如果有100个文件匹配了,那么就需要启100个进程,一个进程处理一个rm命令。一般来说,其越多进程,意味着越耗性能。我们可以换个思路,我们将要删除文件当作参数传递给rm不就可以了吗?也就是说: rm ./bin/core rm ...

Java网络IO编程

在前面的文章 Java IO概述 主要介绍了Java的文件IO。在这一篇,我将继续介绍Java的网络IO编程。 Prequirement 在继续阅读这篇文章之前,请务必先阅读前面这篇Java IO概述,因为Java把所有的IO都统一成流(Stream)了。 TCP/IP协议栈。知道IP、端口、DNS、Socket、URL、TCP、UDP、HTTP等网络相关知识。 IP地址: InetAddress java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的封装。一般来说,它同时包含主机名(hostname)和IP地址。 1. 创建方式(工厂方法) public static InetAddress get...

从面向过程到面向对象——在C中如何实现面向对象编程

引言 像我们这些80后的童鞋,一般都是从C入门,然后转到C++和Java这些面向对象语言。当习惯了OOP的思想后就会开始思考,OOP是怎么来的。为什么我们觉得从面向过程到面向对象是一种自然的进化呢?语言就是一种工具,是应需要产生的,所以必然有这样的需求,才有这样的结果。笔者在阅读开源C源码的过程发现了很多OOP的特征,因此推测OOP就是一种自然的进化。 回顾OOP的三大特性:封装,继承和多态。现在让我们分别研究怎样在C中实现这些OOP特性。 1. 实现OOP中的封装性(不包括成员权限控制) OOP中所谓的封装,其实就是将数据与操作数据的函数绑定在一起成为一个类。其中类中的数据称为数据成员,类中的函数称为方法。这个很简单,只需要在C结构中存放函数指针即可。一般...

从暴风影音事件反思DNS频率攻击漏洞

蝴蝶效应 令人意想不到的是,这次断网的起因竟然是所谓两个网游私服外挂互掐,一个游戏“私服”的网站打算对它的竞争对手发动攻击,黑客在没法黑掉竞争对手网站的情况下,干脆从域名下手,利用肉鸡攻击对方的免费DNS服务商DNSpod的服务器,大流量的DDoS攻击导致了DNSpod的服务器流量剧增,于是被机房停止了服务,导致DNSpod的DNS服务暂停。而非常不巧的是DNSpod正好是暴风影音的域名解析站,所以数以亿万计的全国的暴风用户集体转向电信的DNS解析服务器发起请求,导致电信的DNS服务器瘫痪,形成了这次席卷中国的大规模网络瘫痪。这次攻击间接导致了6省近一天的网络中断,工信部因此强制介入处理,而暴风影音被迫“史无前例”的召回他们的软件。 这次事件看起来暴风影音也是受...

使用Servlet和JSP模拟最小化的SpringMVC框架

web服务器或应用服务器都是容器,容器只知道与Listener或Servlet打交道,因此所谓的Web MVC框架其实就是预定义了一些Servlet帮我们做了本应该是我们做的事情。 关键:如何用Servlet和JSP实现Web MVC框架 一个Web MVC简单的实现如下:在Servlet中实现web控制逻辑,在它们结束之后,再导向到适当的JSP视图。相应的模型对象将通过Servlet API保存在请求对象(HttpRequest)的属性中,在Servlet控制器和JSP视图之间传递。这也是Web MVC最根本的精髓。 public class MyServlet extends HttpServlet{ //重载doGet()方法 protect...

Groovy元编程——使用invokeMethod和闭包构建DSL和Builder

Since 1.0, Groovy supports the ability to intercept all method and property access via the invokeMethod and get/setProperty hooks. If you only want to intercept failed method/property access take a look at Using methodMissing and propertyMissing. invokeMethod介绍 invokeMethod(String name, Object args) is at the heart of Groovy metaprog...

BDB中的共享区域

2009-5-23 星期六 雨天 1. 数据结构 环境数据结构 DB_ENV{} struct __db_env { int db_lorder; /* Byte order. */ /* Error message callback. */ void (*db_errcall) __P((const char *, char *)); FILE *db_errfile; /* Error message file stream. */ const char *db_errpfx; /* Error message prefix. *...

×