博客园 联系 订阅 订阅 管理  

Blog Stats

News

随笔分类

啃技术的虫子

技术连接梦想与现实...

2010年10月22日 #

 
  1. Duplicated Code
    1. In a class: Extract Method
    1. Sibling classes:
      • Extract Method -> Pull Up Method(superclass)
      • Extract Method -> Form Template Method
      • Substitute Algorithm
    1. Extract Class
  1. Long Method (Comments)
    1. Extract Method
    1. Replace Temp with Query
    1. Introduce Parameter Object/Preserve Whole Object
    1. Replace Method with Method Object
    1. Decompose Conditional
  1. Large Class
    1. Extract Class
    1. Extract Subclass
    1. Extract Interface
    1. Duplicate Observed Data (GUI class)
  1. Long Parameter List (Dependency structure)
    1. Replace Method with Method Object
    1. Preserve Whole Object
    1. Introduce Parameter Object
  1. Divergent Change
    1. Extract Class (Strategy/Visitor/Self Delegation)
  1. Shotgun Surgery
    1. Move Method/ Move Field
    1. Inline Class
  1. Feature Envy
    1. Move Method
    1. Extract Method -> Move Method
  1. Data Clumps
    1. Extract Class
    1. Introduce Parameter Object/ Preserve Whole Object
  1. Primitive Obsession
    1. Replace Data Value with Object
    1. Replace Type Code with Class/Replace Type Code with Subclass/Replace Type Code with State/Strategy
    1. Extract Class
    1. Introduce Parameter Object
    1. Replace Array with Object
  1. Switch Statements (Polymorphism)
    1. Extract Method
    1. Move Method
    1. Replace Type Code with Subclass/Replace Type Code with State/Strategy
    1. Replace Conditional with Polymorphism
    1. Replace Parameter with Explicit Methods
    1. Introduce Null Object
  1. Parallel Inheritance Hierarchies (Shotgun Surgery)
    1. Move Method
    1. Move Field
  1. Lazy Class
    1. Collapse Hierarchy
    1. Inline Class
  1. Speculative Generality
    1. Collapse Hierarchy (abstract class)
    1. Inline Class (delegation)
    1. Remove Parameter
    1. Rename Method
  1. Temporary Field
    1. Extract Class
    1. Introduce Null Object
  1. Message Chains (structure of navigation)
    1. Hide Delegate
    2. Extract Method
    1. Move Method
  1. Middle Man (encapsulation/delegation)
    1. Remove Middle Man
    1. Inline Method
    1. Replace Delegation with Inheritance
  1. Inappropriate Intimacy
    1. Move Method/Move Field
    1. Change Bidirectional Association to Unidirectional
    1. Extract Class
    1. Hide Delegate
    1. Replace Inheritance with Delegation
  1. Alternative Classes with Different Interfaces
    1. Rename Method
    1. Move Method
    1. Extract Superclass
  1. Incomplete Library Class
    1. Introduce Foreign Method
    1. Introduce Local Extension
  1. Data Class
    1. Encapsulation Field
    1. Encapsulation Collection
    1. Remove Setting Method
    1. Move Method
    1. Extract Method
    1. Hide Method
  1. Refused Bequest
    1. Replace Inheritance with Delegation
  1. Comments
    1. Extract Method
    1. Rename Method
    1. Introduce Assertion
posted @ 2010-10-22 19:36 missair 阅读(70) 评论(0) 编辑

2010年8月5日 #

解法:
1. 遍历链表,将已经遍历过的节点放在一个hash表中,如果一个节点已经存在hash表中,说明有环。时间:O(n) 空间:O(n)
2. 反转链表 时间O(n),空间O(1),使用三个指针
3. 快慢指针。 时间O(n), 空间O(1),使用两个指针

参考:
http://kb.cnblogs.com/page/52054/
http://www.cnblogs.com/shawn-zhou/archive/2008/11/26/1341307.html
http://kb.cnblogs.com/page/52054/
http://keep.javaeye.com/blog/293454

【摘要】有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?扩展:判断两个单链表是否相交,如果相交,给出相交的第一个点。

有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。

问题:

1、如何判断一个链表是不是这类链表?
2、如果链表为存在环,如果找到环的入口点?

解答:

一、判断链表是否存在环,办法为:

设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:

 

判断环是否存在
 1 bool IsExitsLoop(slist * head)
 2 {
 3     slist * slow = head ,  * fast = head;
 4 
 5      while  ( fast  &&  fast -> next ) 
 6      {
 7          slow  =  slow -> next;
 8          fast  =  fast -> next -> next;
 9         if  ( slow  ==  fast )  break ;
10      }
11  
12      return   ! (fast  ==  NULL  ||  fast -> next  ==  NULL);
13 

 

 

二、找到环的入口点

当fast若与slow相遇时,slow肯定没有走遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则 fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:

2s = s + nr
s= nr

设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。
a + x = nr
a + x = (n – 1)r +r = (n-1)r + L - a
a = (n-1)r + (L – a – x)

(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

程序描述如下:

找到环的入口点
 1 slist *  FindLoopPort(slist * head)
 2 {
 3     slist * slow  =  head,  * fast  =  head;
 4 
 5     while  ( fast  &&  fast -> next ) 
 6     {
 7         slow  =  slow -> next;
 8         fast  =  fast -> next -> next;
 9         if  ( slow  ==  fast )  break ;
10     }
11 
12     if  (fast  ==  NULL  ||  fast -> next  ==  NULL)
13         return  NULL;
14 
15     slow  =  head;
16     while  (slow  !=  fast)
17     {
18          slow  =  slow -> next;
19          fast  =  fast -> next;
20     }
21 
22     return  slow;
23 

 

附一种易于理解的解释:

一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
关于这个解法最形象的比喻就是在操场当中跑步,速度快的会把速度慢的扣圈

可以证明,p2追赶上p1的时候,p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追上

我们可以从p2和p1的位置差距来证明,p2一定会赶上p1但是不会跳过p1的

因为p2每次走2步,而p1走一步,所以他们之间的差距是一步一步的缩小,4,3,2,1,0 到0的时候就重合了

根据这个方式,可以证明,p2每次走三步以上,并不总能加快检测的速度,反而有可能判别不出有环

既然能够判断出是否是有环路,那改如何找到这个环路的入口呢?

解法如下: 当p2按照每次2步,p1每次一步的方式走,发现p2和p1重合,确定了单向链表有环路了

接下来,让p2回到链表的头部,重新走,每次步长不是走2了,而是走1,那么当p1和p2再次相遇的时候,就是环路的入口了。

这点可以证明的:

在p2和p1第一次相遇的时候,假定p1走了n步骤,环路的入口是在p步的时候经过的,那么有

p1走的路径: p+c = n;         c为p1和p2相交点,距离环路入口的距离

p2走的路径: p+c+k*L = 2*n;   L为环路的周长,k是整数

显然,如果从p+c点开始,p1再走n步骤的话,还可以回到p+c这个点

同时p2从头开始走的话,经过n步,也会达到p+c这点

显然在这个步骤当中p1和p2只有前p步骤走的路径不同,所以当p1和p2再次重合的时候,必然是在链表的环路入口点上。

 

扩展问题:

判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。

比较好的方法有两个:

一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。

二、如果两个链表相交,那个两个链表从相交点到链表结束都是相同的节点,我们可以先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。

这时我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。

 

posted @ 2010-08-05 21:02 missair 阅读(412) 评论(0) 编辑

2007年12月15日 #

来源:http://asp.net/downloads/3.5-extensions/

1. MVC(模型-视图-控制器)模式

对现有ASP.NET 3.5 运行时提供MVC支持,使开发者可以更方便的利用这一设计模式,有助于实现和维护应用中清晰的结构,并方便基于测试驱动的开发。

2. 动态数据

帮助开发人员快速创建具有完整的可定制功能、数据驱动的应用程序。它提供了丰富的基础框架,无需写代码就可进行快速数据驱动的开发,而且使用传统的ASP.NET编程模型即可方便的对其扩展。

3. AJAX增强

支持对浏览器历史数据的管理,即对浏览器中前进/后退功能的支持。

4. ADO.NET 实体框架

ADO.NET 实体框架是一个新的建模框架,它使开发者定义出反映现实世界信息的数据库概念模型,并使得应用中数据访问层的代码更易理解和维护。

5. ADO.NET 数据服务

ADO.NET 数据服务使用简单的URI路径,即可在Web中查找、操作和分发数据。它分离了应用中的表现层和数据访问层。

6. 新增ASP.NET服务器控件,以便更好的在Web应用中支持Silverlight

使用两个新的ASP.NET服务器控件,以便在ASP.NET Web应用中利用Silverlight的丰富功能:
    MediaPlayer服务器控件:使音频和视频媒体资源可以被方便的整合进Web应用
    Silverlight服务器控件:允许ASP.NET页面可以引用XAML对象及其事件处理程序。

posted @ 2007-12-15 00:06 missair 阅读(121) 评论(0) 编辑

2007年12月14日 #

 

posted @ 2007-12-14 20:51 missair 阅读(96) 评论(0) 编辑

2007年9月17日 #

基本环境:
服务器名称:tfsserver
操作系统:x86 中文Windows 2003 服务器标准版 + Service Pack 2    
所需要的域账户:
TFS服务用户: domain\tfs
报表服务用户:domain\report

第一部分:Team Foundation Server 服务器端的安装
1. 安装IIS6.0:
    1) 打开添加或删除程序
    2) 打开添加/删除Windows组件
    3) 选中应用程序服务器,保持默认选项即可
2. 安装SQL Server 2005 Enterprise 版本   
    1) 需要安装的组件有:
      a. SQL Server DataBase Services  
      b. Analysis Services
      c. Reporting Services
      d. 工作站组件、联机丛书和开发工具(便于数据库管理)   
    2) 实例名称:默认实例
    3) 服务账户:网络服务,并在安装结束时启动服务中,选中全部的组件
    4) 身份验证模式:选择Windows身份验证模式
    5) 排序规则设置:请保持默认值
    6) 报表服务器安装选项:选择“安装但不配置服务器”
    7) 开始安装SQL Server 2005
3. 安装SQL Server 2005 SP2
    1) 功能选择:全部选中
    2) 身分验证:默认选项,即Windows身份验证
    3) 如要求,请重新启动服务器
4. 安装Team Foundation Server
    1) Team Foundation 数据库服务器:填入服务器名称tfsserver
    2) Team Foundation Server服务账户:选择指定账户,输入帐户名domain\tfs和对应密码
    3) Reporting Services数据源账户: 选择指定账户,输入帐户名domain\report和对应密码
    4) Windows Sharepoint Services: 选择"在此计算机上安装和配置Window Sharepoint Services 3.0"
    5) Windows Sharepoint Services 服务账户:选择"使用Team Foundation Server 服务账户"   
    6) 指定警报设置:如有需要,可勾选"启动Team Foundation 警报",设置SMTP服务器和发件人电子邮件地址,否则直接略过此步。
    7) 安装准备就绪:检查安装组件和设置信息是否正确,如果需要修改,可单击"上一步",返回相应的设置页面,否则单击“安装”,开始安装TFS。
5. 安装TFS时,需要安装的组件有:
    1) Microsoft .NET Framework 3.5 
    2) Windows Sharepoint Services 3.0
    3) Microsoft Visual Studio 2008 Team Foundation Server Beta 2
6. 重新启动服务器
7. 检查TFS是否已经安装成功
    1) 访问页面http://localhost:8080/services/v1.0/Registration.asmx,单击“GetRegistrationEntries”
    2) 在页面GetRegistrationEntries中单击“Invoke”
    3) 在返回的xml结果中查找字符串“<Type>vstfs</Type>”,如果可以找到,则表明TFS已经成功安装
8. 访问并检查Reporting Services的网站是否可以正常工作: http://localhost/reports

第二部分:客户端的安装(与TFS在同一台服务器上)
需要的安装客户端产品及安装顺序:
1. Office 2007
2. Project Professional 2007
3. Orcas VSTS Beta2 中文版
4. Team Explorer
5. Team Build

posted @ 2007-09-17 09:48 missair 阅读(1140) 评论(1) 编辑

2007年9月2日 #

摘要: 昨天我打开微软网站首页时,惊奇的发现,有动画效果的广告已经由Silverlight取代了原先的Flash来实现,因为被提示需要安装Sliverlight的运行时。 我想,随着Silverlight正式发布(1.0版本已经到RC了),它的应用将会越来越多,应用领域也将越来越广。个人认为,Silverlight的出现,相对于.Net程序员来说,是一个崭新的机会,不需要另外学习一套编程技术,仅仅是利用自...阅读全文
posted @ 2007-09-02 18:01 missair 阅读(522) 评论(6) 编辑

posted @ 2007-09-02 16:55 missair 阅读(224) 评论(0) 编辑

仅列出标题