摘要: 提纲 开灯的例子 暗流涌动 Guru眼中的依赖 DIP(依赖倒置原则) 为什么要解耦合? 接口的坏味道 同一张类图的不同解释——真假DIP 了解DIP有什么用?DIP用在什么地方? 下回预告 参考文献 开灯的例子 选开灯做例子,是因为这个例子既常见又简单,而且潜在的需求多样。对于最简单的灯,从功能上讲,按下灯上的开关,灯就开了。 用代码实现这样一个有开关功能的灯,也是一件很容易的事情。 public class Light{ public void TurnOn() { Console.WriteLine("Light Turn On"); } pub... 阅读全文
posted @ 2012-05-26 22:29 南柯之石 阅读(10905) 评论(74) 推荐(43) 编辑

2014年6月7日

只有注册用户登录后才能阅读该文。 阅读全文
posted @ 2014-06-07 17:50 南柯之石 阅读(173) 评论(2) 推荐(3) 编辑

2014年4月10日

摘要: 曾经有人问我这样一个问题:如何迫使子类提供无参构造函数。当时给出的答案是让子类实现这样一个接口。 public interface IMustHaveParameterLessConstructor where T : IMustHaveParameterLessConstructor, new() { }这种在泛型参数中引用自身的技法,还有个名字,叫做“Self-Referencing Generics”模式。这个技法在C++中已经被使用了20多年,只不过叫做Curiously Recurring Template。这个技法可以用来实现不少有用的功能。比如为所... 阅读全文
posted @ 2014-04-10 23:14 南柯之石 阅读(877) 评论(0) 推荐(1) 编辑

2014年3月22日

摘要: 如果有个操作,我们需要过一会儿再做,或者每隔一段时间就要做一次。可以有很多种做法。独立线程是的,对.NET Framework本身一知半解的程序员才会使用这种方案。不过,现实中这个方案其实并不少见。 public static void Repeat(this Action action, TimeSpan interval) { new Thread(new ThreadStart(() => { while(true) { ... 阅读全文
posted @ 2014-03-22 16:46 南柯之石 阅读(10830) 评论(2) 推荐(3) 编辑

2013年1月30日

摘要: 有个简单的问题:Looking for Windows API Definitions大体是在问:C#有没有类似C++中使用的windows.h文件?这真是个愚蠢的问题,是个C#程序员都会知道,C#没有什么头文件的说法。所以答案太简单了:没有 -_-。是啊,这是个C#程序员都知道的答案。但是怎么依然有人问出这个问题呢?所以,要么问问题的人是个白痴,要么其实是你没理解这个问题。这个问题的真实目的是,他想要在C#中调用Native Windows API,但是又觉得一个个声明Windows API及其用到的数据结构很繁琐。而在C++中,引入了windows.h之后可以直接调用了。当然更多的人理解了 阅读全文
posted @ 2013-01-30 00:34 南柯之石 阅读(737) 评论(0) 推荐(2) 编辑

2012年11月29日

摘要: The usernames used to establish connections to servers are often specified in configuration files. In most project, the configuration items works in this way:1. Connection string for each server is configured respectively. (Take only username here for an instance) 2. Each environment has different . 阅读全文
posted @ 2012-11-29 00:18 南柯之石 阅读(400) 评论(0) 推荐(0) 编辑

2012年9月4日

摘要: 问题描述 WPF自带的ListView和DataGrid控,都提供了数据分组的支持,并可以对分组的Header进行自定义。但是,如果想在每个分组的Header中,显示出本分组的"小计"就不是一件容易的事情了。 假设要用一个ListView用于显示全校学生成绩。按班级分组,并在分组头中显示班级平均分。 最终效果大致如下: 图1. 在分组的Header中显示本分组的Aggregation 怎么样?有什么思路?实现的难点有:Group Header中的第一例显示为分组的名称。Group Header中的其它列与数据一致。Group Header中各列的宽度与ListView中列对 阅读全文
posted @ 2012-09-04 23:00 南柯之石 阅读(4855) 评论(3) 推荐(1) 编辑

2012年8月18日

摘要: 上回问题回顾 上回的最后,来了两个用户,分别提出了两个不同的需求。一个要求用两个开关控制一个灯,一个要求用一个开关控制所有的灯。本回将就这两个需求进行分析。我写这段话的时候并没有想出这个需求的具体方案,重要的过程,思路有时候比结果更重要。所以,我的方案可能会"跑偏";但是如果你能从过程中体会到些什么,那这篇就没有白写。 两个开关控制一个灯。这个问题好像很简单,把两个Switcher的Switchee都设置为同一个灯不就结了吗?画个对象图会是这个样子。 图1 由双开关控制的灯 有问题吗? 用户的真实需求 考虑一下这个问题。如果你用Switcher1开了灯,... 阅读全文
posted @ 2012-08-18 16:20 南柯之石 阅读(14402) 评论(30) 推荐(41) 编辑

2012年6月9日

摘要: 如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。 这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把GET改个名字叫GET2。他反问道,那就是单纯的名字上的区别喽?我想了想,我觉得如果说再具体的区别,只能去看RFC文档了,还要取决于服务器(指Apache,IIS)的具体实现。但我不得不承认,我的确没有仔细看过HTTP的RFC文档。于是我说,我对HTTP协议不太熟悉。这个问题也就结束了。 最普遍的答案 回来之... 阅读全文
posted @ 2012-06-09 11:47 南柯之石 阅读(84723) 评论(134) 推荐(131) 编辑

2012年5月31日

摘要: 上回问题回顾 前文说到一位用户拿着业界标准开关(一个标准的StandardSwitcher,它依赖IStandardSwitchable接口才能工作,然而目前我们的灯并不支持这个接口)出现在我面前,叫嚣着他的“标准开关”应该能打开我们的灯。好吧,这个需求是合理的,的确应该支持。但是该死的是,为什么没有早一点儿知道这个标准的存在呢?这样就不需要花费时间和人力定义这个接口,现在也不会这么纠结。和上次一样,先讲故事、演进方案,再分析背后的思想。 这回主要讲解Adapter模式,GoF讲解了这个模式是什么,怎么用,用在什么地方。我想来解释一下Adapter模式的要点是什么,对Adapter模式的延展, 阅读全文
posted @ 2012-05-31 22:52 南柯之石 阅读(21204) 评论(27) 推荐(31) 编辑

2012年5月12日

摘要: .NET提供了很多序列化对象的方法,了解他们之间的区别才能更好地确定使用哪一种序列化方式并正确地使用。本文从下面几个方面对标题中的三种序列化方法进行了分析。 范围:Property Or Field Or Both 可见性:Public or Private Or All 可访问性:Readonly Property 回调:指OnSerializing, OnSerialized, OnDeserializing, OnDeserialized这些回调。 包含循环引用的对象 包含Dictionary的对象 乱序读(XML) 自定义序列化结果。... 阅读全文
posted @ 2012-05-12 22:06 南柯之石 阅读(6723) 评论(6) 推荐(5) 编辑

2012年3月18日

摘要: 平时有人问我业余时间会做点儿什么? 我说:用WPF写个游戏玩玩。 :写的什么? 我:扫雷。 :…… 我:想想都写了快两年了。 :orz 单纯地讲扫雷游戏都会觉得很简单,都不好意思当个事儿,我一开始也是这样觉得。写着写着才发现,事情其实没有想象中的那么简单。先给大家上个图看看效果吧。 写这个扫雷程序的主要目的,并不是练习WPF,也不是用WPF复刻Windows自带的这个游戏。这两件事儿其实都不至于做两年。(当然不是持续的两年,连续讲的话,是三个月的晚上吧。) 写这个扫雷程序,是想探究桌面应用程序开发的最佳实践和模式,也能成为自己这几年WPF工作的一个沉淀。而扫雷,只因为其... 阅读全文
posted @ 2012-03-18 19:47 南柯之石 阅读(3104) 评论(6) 推荐(5) 编辑
摘要: 从触发器说起 之前写了一篇NoSQL和MemeryCache的出现意味着传统数据库使用方式的变革吗?,里面描述了一下目前所在项目的数据库使用的情况————基本就是把SQL Server当成一个可自定义结构的文件在用。没有使用到任何数据库自身的特性,比如外键、约束、存储过程、触发器、自定义函数等。原因是我们的领导根据自己的经验,认为这些东西带来的麻烦大于好处,所以干脆就不要用。 不少人回复的意思... 阅读全文
posted @ 2012-03-18 14:22 南柯之石 阅读(2489) 评论(11) 推荐(9) 编辑

2012年3月10日

摘要: 下面是苹果UI交互设计师Bret Victor的一个讲座视频。主要讲解了如何通过工具上的创新,更高效地写代码、调试代码、测试代码、设计电路图和创作动画。 视频中所带来的设计理念、工具和视觉效果都令我非常地震撼。然而,看视频的时候我就在考虑另一个问题。如此优秀的交互设计师,不仅仅需要有相当的艺术水准(主要指交互,不是指视觉),更需要有相当的专业水平。毕业以来工作的几家公司,都有自... 阅读全文
posted @ 2012-03-10 15:12 南柯之石 阅读(1289) 评论(1) 推荐(0) 编辑

2012年2月12日

摘要: 故事的起源 作为软件工程专业出身的程序员,之前所接受的关于数据库的教育都是基于关系型数据库。对key-value based数据库和document-based数据库的都只是仅仅了解而已。 最近公司要做一个类似电商的系统,我来负责数据库的设计和接口的提供。当然,我们使用的数据库也是传统的关系型数据库SQL SERVER 2005,所以我也并没有什么太大压力。 但是当头儿看到我设计的分类系统的... 阅读全文
posted @ 2012-02-12 17:20 南柯之石 阅读(5925) 评论(30) 推荐(11) 编辑

2012年2月11日

摘要: 摘要 问题的抽象 没有优化的反射 使用晚绑定优化的反射 公平的竞赛 公平的实现方式 换个思路,最直白的实现方式 运行时生成代码 性能比拼 摘要 单纯的反射带来灵活性的同时,也大大降低了应用程序的效率... 阅读全文
posted @ 2012-02-11 19:43 南柯之石 阅读(13807) 评论(21) 推荐(16) 编辑

2012年1月10日

摘要: 公司最近正在对整个产品进行大规模的重构,把原先基于Web的产品线全部转向Android平台。随之而来的就是产品整体架构设计上的大讨论。作为其中一项最为旷日持久的争论的发起者,我觉得有必要把这个事件记下来。无论现在的思路或是观点是成熟的还是幼稚的。以后都可以引以为鉴。 先来描述一下我们要做什么。简单而言就是一个横跨各个内容源的书籍阅读平台。这个平台的目标不仅仅是方便用户在一个终端上,以一种统一的方... 阅读全文
posted @ 2012-01-10 23:57 南柯之石 阅读(733) 评论(1) 推荐(2) 编辑

2011年12月22日

摘要: 在产品的验收阶段,正式发布前一周,紧急动员全公司的人,对1万多本电子书进行人肉测试。我觉得这事儿真是有点儿意思。不知道各位怎么看?也许所有的公司或产品都有可能出现类似的状况,但是我想分析一下:为什么会出现这样的事件,有没有什么办法尽量避免出现类似的事情? 故事的背景是,公司新研发的电子书设备发布在即;同时,为了丰富在设备上可以阅读的书籍的来源,也在接入一些其它公司的内容,其格式为... 阅读全文
posted @ 2011-12-22 23:30 南柯之石 阅读(703) 评论(1) 推荐(1) 编辑

2011年12月20日

摘要: 使用到这东西完全是个巧合和无奈之举。不小心在数据库中插入了一些HttpUtility.UrlEncodeUnicode之后的数据。数据库里的一些字段成了%uxxxx%uxxxx这样的结构。 搜索了半天T-SQL UrlDecode的函数,发现都不支持上面这种Unicode的。自己对T-SQL又不熟悉,时间也很紧迫。 解铃还须系铃人,想到在T-SQL里调用HttpUtility.UrlDecod... 阅读全文
posted @ 2011-12-20 19:15 南柯之石 阅读(2336) 评论(0) 推荐(1) 编辑

2011年11月29日

摘要: 看MSND好长CREATETABLEXMLTable(IDintprimarykey,Dataxml,)INSERTINTOXMLTable(ID,Data)Values(1,'<entity><id>1</id><name>name</name></entity>')SelectData.query('/entity/name/text()')FROMXMLTableWHEREData.value('(/entity/id)[1]','int')=1--Pe 阅读全文
posted @ 2011-11-29 20:06 南柯之石 阅读(516) 评论(0) 推荐(0) 编辑

2011年9月24日

摘要: 昨天试过Linux系统下的BufBomb练习,结果在最后时刻被Linux操作系统的ExecShield给做了。正是由于这ExecShield,在Linux平台上,传统的Buffer Overflow已经彻底失效了。 今天我们来试下Windows平台。昨天那篇日志是我练习时留下的笔记,所以比较乱,很多地方没有讲明白。这次是做完练习之后的整理,我会尽量把步骤介绍清楚。 首先,为了在Windows平... 阅读全文
posted @ 2011-09-24 00:20 南柯之石 阅读(10735) 评论(35) 推荐(1) 编辑

2011年9月23日

摘要: 《深入理解计算机系统》练习3.38,要求对提供的一个程序进行缓冲区溢出攻击。这里给出自己解题过程。这个程序在不做修改的情况下,在windows平台是无法编译的。所以以下练习基于Ubuntu 11.04 + GCC 4.5.2 要求是:让这个一直输出1的程序输出-559038737(deadbeef)。 目标就是要溢出getbuf这个函数,就把把getbuf这个函数内的执行权拿到,但在运行完我们指定的代码之后,我们还是要让这个函数返回到他本来就应该返回的地方的。查看test的汇编代码。 08048597 <test>: 8048597: 55 push %ebp 8048598: 8 阅读全文
posted @ 2011-09-23 01:07 南柯之石 阅读(5950) 评论(4) 推荐(0) 编辑

2011年8月22日

摘要: 刚才无聊,截了几个网络包,发现登录时没有把用户的密码加密的网点真是不少。不加密咋了?不加密的话,你的密码在发到网站的路上,就可能被别人看到啊。更悲剧的情况是所有网站基本用一个用户名、密码。下面是一部分明文传密码的网站:猫扑http://www.mop.com/天涯http://www.tianya.cn/人人网 http://www.renren.com/土豆网http://www.tudou.com/优酷网http://www.youku.com/豆丁网http://www.docin.com/赶集网http://www.ganji.com/58同城http://www.58.com/(登录 阅读全文
posted @ 2011-08-22 01:21 南柯之石 阅读(2876) 评论(3) 推荐(0) 编辑

2011年6月11日

摘要: 下面表格中的操作的HTTP请求头中的HOST都必须是appwk.baidu.com。都是以POST的形式请求。POST的数据的格式都是: request={"Bdi_bear":"UMTS","BDUSS":""} 其中BDUSS是登录时服务器发回的Token。但多数操作并不要求登录,这个BDUSS可以为空。 操作 URL 注 返回数据 下载排行 http://wenku.n.shifen.com/?rt=dl&type=1&pn=0&rn=10 type=0: 特别推荐 type=1: 下 阅读全文
posted @ 2011-06-11 13:12 南柯之石 阅读(1796) 评论(0) 推荐(0) 编辑

2011年1月24日

摘要: 文中所有比较都是区分大小写的。 在C++中: "a" "A": True "aA" "A": True "aA" "AA": True "Aa" "AA": True "ac" "Ab": True 非常明显,在C++中,字符串比较遵循下面两条规则: 1. 小写大写 2. 从前向后依次比较。这一条的一个推论就是:无视整体长度。 我个人觉得这非常合理,这也就是英语词典的排序方式。   但是我们看看在.NET中的结果。 String::Compare("a", "A"): –1 String::Compare("aA", "A"): 1       阅读全文
posted @ 2011-01-24 14:06 南柯之石 阅读(1157) 评论(6) 推荐(0) 编辑

2011年1月3日

摘要: 说白了就是在盛大的服务器上存放自己的临时文件的东西。(可用来共享文件或中转文件)目前正处于公测阶段,需要邀请码才能注册。(倒不是当小白给他们测试东西,主要这个时候一般都可以注册到自己喜欢的ID)手头上还有几个公测邀请码。有需要的朋友留个话。最好有邮箱,那个邀请要发到邮箱里。 阅读全文
posted @ 2011-01-03 22:53 南柯之石 阅读(570) 评论(3) 推荐(0) 编辑

2010年11月20日

摘要: 使用DataGrid控件显示数据是很简单的,只要把数据赋给ItemsSource属性就可以了,数据列都会自动地帮你生成出来。那么在整个过程中,哪个环节是最慢的呢?之所以要写这文章,就是因为最近发现DataGrid的列操作是最慢的。而且慢得不可理喻。比如在DataGrid中显示1万数据行简直就是小菜一碟。因为有RowVirtualization机制,只有显示出来的部分才会生成控件。DataGrid也... 阅读全文
posted @ 2010-11-20 00:23 南柯之石 阅读(4414) 评论(26) 推荐(5) 编辑

2010年11月19日

摘要: 这两天在试图解决DataGrid的一个性能问题的时候发现DataGridColumnCollection里有下面这样的一段代码。发上来跟大家一起鉴定一下有没有什么问题。 代码如下(426行): newDisplayIndex=CoerceDefaultDisplayIndex(column,columnIndex); //Insertingthecolumninthemapmeansthat... 阅读全文
posted @ 2010-11-19 19:59 南柯之石 阅读(1071) 评论(4) 推荐(0) 编辑

2010年9月12日

摘要: I tried for a long time. Only questions about it could be found on the Internet, but no complete answer. I have to admit, this is the most painful part while developing an android application. While, ... 阅读全文
posted @ 2010-09-12 21:56 南柯之石 阅读(1154) 评论(0) 推荐(0) 编辑

2010年7月10日

摘要: 首先,千万不要觉得Adorner离你很远,因为最简单的WPF界面也会用到Adorner。在WPF中,下面的几个很常见的功能,都是用Adorner实现的。 1. 光标(caret) 2. 焦点(focus) 3. 高亮(highlight) 4. 拖拽预览(drag and drop) 5. 拼写错误提示 6. 数据绑定中用来提示错误的Error Template 当然还有别的,用Reflecto... 阅读全文
posted @ 2010-07-10 16:55 南柯之石 阅读(10790) 评论(4) 推荐(9) 编辑

导航