2005年04月25日

.NET我曾经尝试用过了大量的工具,现在说说我推荐的工具吧:)

源码查看工具:
Reflector                        
不多说了。

加密与混淆工具:
Xeno2005                        
引用别人的介绍:一款为.NET平台下的开发人员设计的功能强大、灵活和易于使用的代码保护及优化的工具,该软件的.NET分析和重编译引擎保护用户的代码反编译,提高增强程序性能以及提供对.NET框架的支持,包括MC++和Satellite Assemblies

数据库建模工具:
Visio                                 
针对于Sql Server 2000,可以采用Visual Studio2003光碟包中自带的Visio,支持正向生成与反向工程。但Visio在针对其它数据库的支持上有许多问题存在,具体的问题列表,可以查看Visio安装目录上的文档说明。Visio无论用于数据库模型建模还是ORM建型,操作都十分简便。同时也支持鼠标中键缩放视图,非常不错。Visio2003虽然界面漂亮,但仅有反向工程能力,是最大的弊病。

PowerDesign                
非常不错的建模工具,支持多种数据库,相对于Visio的版面来说PowerDesign提供了近乎无限大的空间,当然这是仁者见仁,智能见智的问题,但PowerDesign提供了非常强大的反向落工程能力,在反向出来的数据库模型图上,会智能地摆放各个模型所在的位置,尽力做到线路不交叉,同时支持鼠标中键缩放,非常不错。不足之处在于,在模型图上输入或修改字段时,必须打开一个界面不是很友好的界面,无论是初学者还是常用这个工具的人,都会感到烦燥不已。另外,软件的界面不好看,默认字体过小。

Visual Studio.Net 2003 
严格地说,vs2003并没有建模能力,因为它仅对Sql Server2000提供较好的支持,但它可以在服务管理器上直接对数据库进行新增和删除表、视图、存储过程的操作,同时也支持在直接画Sql Server的关系图,自定义模型视图的显示方式非常不错,而且在使用起来非常简洁,但可惜的是GDI+的性能是它的使用瓶颈,在图表过数量过多的时候,对内存占用非常大,显示速度也受到影响,让人感觉很差。


ERWin        
经典的数据库建模工具,但现在好像已经没有怎么更新了,至少我不清楚。它提供简洁明了的视图进行数据库建模,但不支持鼠标中键的缩放,难免会带来极大的不便,另外,它的新增、修改、添加字段,也是令人不爽的地方,使用起来并不方便,界面不是很友好。但总得来说,它提供了多种数据库的支持,同时也有大量的数据库建模人员在使用它,所以它仍有它独特的价值与魅力。

测试工具
nunit         
Nunit是驱动测试开发中的非常不错的工具,如果没有Nunit,测试驱动开发要么会成为空谈,要么会变得很复杂,不过,Nunit,也许是太过于注重简洁,界面过于简单,提供的功能并不多,但无论如何,作为一个经典的软件,它仍是我们软件工具箱中,必不可少的。

TestDriven      
TestDriven的前身是Nunit Addin,它把Nunit结合到了vs.net2003的Addin之中,使得开发人员在开发的过程中,不必再去费神开启Nunit,带来了一定的便利性,但更值得一提的是,这里面还提供了MbUnit,MbUnit除了提供了类似于Nunit工具的功能以外,更提供了大量的分析数据报表,可以让开发人员在开发过程中,获取更为详细的分析数据,不过,我个人认为这些功能在开发过程有时候并不必要。但如果把MbUnit应用在每日构建之中,相信将会带来更好的结果。

Parasoft.TEST    
刚看到介绍的时候,就对这个东西感兴趣了,我尝试安装了,由于它是基于java的。我一开始很怀疑它的性能,不过在试用了之后,感觉它还是不错的,它可以对.Net程序进行单元测试的工具,并且不需要写测试脚本,可以让开发人员轻松的点击一个按钮就自动进行动态和静态测试源代码,但它对中文源码支持非常不好。

Compuware.DevPartner.Studio 
如果不提到这个工具,我认为本文也没有写出来的必要了,这个工具内部包括了非常优秀功能,比如对代码规范性检测,对内存情况分析,对代码分析并提供优化建议,并且还有一个十分令人意外的功能,就是它可以找到你的一个方法引用了哪些类或方法,并用图表现出来,在这一点上做得十分不错。另外,它对中文源码的提供了部分的支持,在某些情况下,仍然也会出现乱码,但不管怎么说,这款软件应该是开发人员必备之宝。

重构工具
CSharpRefactory   
我不认为它是一个很好的重构工具,首先它只支持C#,而且还经常出错,使用起来,要冒着一定的危险。

C# Refactoring Tool  
同样的,也是一个出错出得让人想杀人的那种,虽然赞誉甚多,但我真的没有发现它有什么地方可以让我感觉良好的。

Resharper      
这个工具不算是重构工具,因为它还提供了许多其它特点的功能,但在重构工具的工具箱中,我也只有它了。它在重构的支持上,虽然不如java世界里面的IDE工具那么牛,但它毕竟提供了我们不错的功能,可惜对中文源码的支持非常不好。

Together                          
如果用Together来进行重构的话,还是自己用手来做吧,它虽然重构提供了中文源码的支持,但它的速度,实在是令不敢恭维,它的重构是可以让开发人员生不如死的,在此一点上,给它两颗星,是因为在这方面,毕竟它提供了此功能并支持了中文的源码,在被逼无奈的时候,还是可以用用的。(顺便说一下,它的重构使得我不承认它能算得上是MDA工具)

代码生成
IronWorks                        
这个工具相对说来,还是很棒,但因为它破解不太好找,也制约了开发人员使用它,还是…呃,算了。

nTierGen                         
它是一个面对于数据库访问的代码生成工具,感觉上它还只是马马虎虎,不过它生成的代码大大减少了开发人员的工作量。

Monstarillo                       
非常不错的代码生成工具,也是针对于数据库的代码生成工具,不过,它支持直接生成aspx页面,并提供了相对灵活的配置,还可以指定生成为通过Microsoft Application DataAccess Block生成的数据库访问代码,目前流传的版本是我把它那个那个了一下之后,…嘿嘿,不说了。

CodeSmith     
这是一个通用性的代码生成工具,提供了十分灵活的模板配置功能。具体介绍网上已经很多,不再多提。

2005年03月17日

源代码3.17         

数据库下载

2004年09月29日

http://bbs.12386.net/ShowPost.aspx?PostID=479

2004年09月14日

http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/TenMHToolEDevShouDN.mspx

2004年08月31日

http://www.ootips.org/

2004年08月17日

阅读《Better, Faster, Lighter Programming in .NET and Java》http://www.onjava.com/pub/a/onjava/2004/07/14/BFLJava.html

感悟:
透明 除了domain(罗辑层)外,其他的都相对于domain是透明的,都是Servicees 包括persistent(数据层) presentation layer (表示层) 也就是说domain中不能够访问Services的方法,或者说domain不可以向Servic发消息——因为它不知道他们的存在

摘要:
In order to keep the business model light, simple, and easy to maintain, you want to keep it as uncluttered with ancillary code as possible. The services provided to the domain model should be transparent, meaning that you shouldn’t have to add anything to your domain objects to get the benefit of those services. At the very least, you shouldn’t have to add anything to them that you can’t safely ignore when you need to, such as at unit-test time.

This domain class doesn’t know anything about how it will be displayed to the user or how it will be persisted to the database. It is entirely focused on representing the code business abstraction invoice, and the rules that apply to its data. Nothing else clutters the code.

感悟:
数据层包含了对数据库所有操作,其他层如domain层必须通过数据层才可以来访问数据库。一切越过数据层直接操作数据库的操作都是不合法的。这样做所有的对当前特定的数据库操作都被封装到了这个数据层里了,对于其他层来说使用什么样的数据库已经变得透明起来。这样以后无论是对数据库的改动还是迁移到另外的数据库支持上,都是可以只在数据层来实现,无需对其他层的代码进行改动了。还有一点建立数据层不是只建立一个类表示数据层(当然这样可强制程序员必须按照层间协议做),我想多个类在一个命名空间里也可以,但这样如何约束程序员不能跨层操作呢?

object/relational (O/R)

 

摘要:
The persistence layer is the same way. By separating out your persistence logic into another class (PersistenceManager) you abstract away the common, non-business- specific functionality of interacting with a database to a transparent part of the code. To implement PersistenceManager, you have a variety of choices. You can implement the transactional script pattern, which is essentially what we did in the first page above. That is to say, you use the native data interaction objects provided by .NET (DataSet, SqlDataAdapter, etc.) to manually pull values out of the Invoice instance and modify the database, manually controlling any transactional semantics yourself.

On the other hand, you could use an object/relational (O/R) mapping framework to handle the work for you. O/R mappers are frameworks that, given a mapping file that relates class definitions with database schema, can auto-generate the SQL scripts needed to perform persistence activities. These kinds of frameworks simplify your code greatly by eliminating all of the hard-coded SQL scripts used by the transactional script pattern, and free you to work in terms of your domain model only. Currently, the major O/R mapping framework available to .NET developers is NHibernate, a .NET port of the popular Java Hibernate framework. NHibernate is an open source project found at nhibernate.sourceforge.net. Microsoft has its own O/R mapping technology called ObjectSpaces that is going to be released with Longhorn and/or Whidbey, but unless you are a beta tester for Microsoft, you can only get NHibernate at present.

摘要:
In the Java world, there are a hundred ways to do anything. If you want an MVC framework, there’s Struts, WebWork, SpringMVC, and one implementation for every J2EE vendor. For O/R mapping, there’s Hibernate, JDO, Kodo, EJBs, etc. Heck, there are even five or six viable IDEs. On the Microsoft side of the world, we have tended to be less diverse. We use Visual Studio for development, ADO.NET for data access, and ASP.NET for our web front end. There aren’t nineteen different web form strategies (Tapestry, Velocity, JavaServer Faces, etc.). However, that focus on a single vendor is starting to change.

If you take a look at SourceForge, you will notice that there are almost as many .NET projects as Java projects now. All of the major tools on the Java side are being ported to .NET. This list includes:

Struts.NET for web MVC
NHibernate for O/R mapping
NUnit for unit testing
Pico.NET and Spring.NET for lightweight alternatives to EnterpriseServices/COM+
NAnt for build management
CruiseControl.NET and Draco.NET for integration builds
C# support in Eclipse and IDEA

摘要:
In general, this means writing code that allows for the unknown. This sounds like an impossible proposition, but in reality, the key factor is understanding where future users are likely to want to change the way your application works, and making those areas as loosely coupled to the rest of the application as possible.

IDocument document = Document.CreateInstance(“some_document_type”,
    “some_assembly”);
The beauty of factory methods is that they can return any concrete type that implements IDocument, not just the original Document class, and they can look up the actual implementation at runtime using reflection. The implementation of CreateInstance might look like:

public static IDocument CreateInstance(string type, string asm)
{
    Assembly assembly = Assembly.Load(asm);
    return (Idocument)assembly.CreateInstance(type);
}

As long as the calling code has passed in an accessible assembly, and the type they asked for implements the IDocument interface, then it doesn’t matter what the concrete type is, or even if it existed when the application was first written.

A special note about reflection: it gets a bum rap. Reflection is slower than direct coupling, but usually measured at about two or three times slower. That means you shouldn’t do everything via reflection, but its judicious use for something like loading a dynamically assigned class at runtime (but binding it statically to a known interface) is perfectly reasonable, especially if you are talking about a modern distributed application, where the two more important criteria for boosting performance are limiting round trips on the network and minimizing hits to the database. If you can solve those problems, then maybe you can think about how a little reflection affects performance. I find that extensibility is usually a more important factor for me.

2004年08月16日

感悟

这几天看了些英文资料收获不小。

接口是抽象类更进一步的发挥,如果不考虑加入函数,首先应该考虑使用接口。

小知识点

switch后的条件必须是整型或字符串型

类中的this是只读的

判断一个类是什么类型 可以用is运算符 如Data is DataTable

在类构造函数中调用另一个被重载的构造函数,是不允许的吗?或者说在类的方法中不可以调用构造函数吗?

继续重构CSHARPOLEDB3

上次对那个统一接口的问题(IPassData)实现上,我被卡住了。现在想来,对特殊情况的了解是通往一般化的必经之路,因此先从一种情况的实现开始比较明智。

问题:我们考虑PassData的PassTable实现
在此之前,我想保留原有的实现方法,也就是说我想让EditBox dlg = new EditBox( this,reader , Table, false );中的reader也符合IPassData接口

考察下面传递PassData的函数接口
public EditBox( IWin32Window win, OleDbDataReader reader, string TableName, bool bInsert )
  {
   InitializeComponent();
   this.editBoxLogic = new EditBoxLogic();     
   this.editBoxLogic.LoadDataSource(reader,TableName,bInsert);
   dataGrid1.DataSource = this.editBoxLogic.GetDataSource(); 
  }
看来问题在EditBoxLogic类中,把它里面对reader的处理进行IPassData接口化。

下面的事情是:EditBox的OK按钮(更新数据按钮)

发现了个bug:当连续两次选中同一行点击Edit按钮就会提示出错。(类太多,思路很容易就混乱了)
下午利用Visio想把这个程序画成静态图,其中顺序图中的抽象类的Create()如何在图中表示呢?因为它不能是对象

先不不管那么多了(bug留着以后再处理)先处理我的通用接口

 

 

 

 

 

2004年08月12日

感悟

有时候我想发太理想 总是学些觉得我喜欢的东西 比如设计方面的东西 可是眼高手低 高深的看不懂 低的又做不来 而且有时候很尴尬 不知道做什么 所以我想要是有一天我真的做了程序员 恐怕没有这么多时间可以自由支配 还是得多编写程序才行 

我决定一天拿出一部分时间来 作些自己不喜欢但是很有实际的事情 写代码完成某些功能 然后不断的发现问题 利用晚上来思考解决他们 只有走走停停 做做想想才会更有收获

有种想法:

现在利用重构别人的代码来仔细的学习重构,再过两个月十月份开始着力开发ttly网,争取两个月开发出雏型。如果网站在2005年年初运行受到好评,则继续发展,否则2005年将不再续费空间和域名。

任务

继续重构那个CSHARPOLEDB3

问题:
现在的问题是列表界面form1和修改界面EditBox之间如何传递要修改的数据——是传递行还是传递dataTable?
a、传递行
优点:由于从列表界面到修改界面,实际上用户只是看到的(修改的)是一行。所以最直观的想法是传递行。
缺点:但是对于Winform程序来说,新的行对象是需要生成的,而对象DataTable是原先就有的,只不过在不同的界面间传递引用而已。
实现上的问题:
b、传递dataTable
优点:
缺点:
实现上的问题:
新想法:为什么不能两种方式都试验一下,看看最终结果再说。那得从实现思路开始考虑了,先从传递DataTable开始(目前认为更合理的)注意:要是两种方式都实现又不用写重复代码那么应该考虑好通用的接口。

研究同一种功能的多种实现是一种学习设计和学习功能实现相结合的折中办法。
这件事做值不值的,当发现一个问题需要有两个以上的未知问题要解,那么就该考虑把目标问题修正一下(分解现在的大问题为不同的小问题,把当前的目标定为其中的一个小问题)

下面的问题——如何设计实现两种实现形式的通用接口
1、如何用DataView.RowFilter显示选定的部分数据
private void MakeDataView()
{
   DataView dv = new DataView();

   dv.Table = DataSet1.Tables["Suppliers"];
   dv.AllowDelete = true;
   dv.AllowEdit = true;
   dv.AllowNew = true;
   dv.RowFilter = “City = ‘Berlin’”;
   dv.RowStateFilter = DataViewRowState.ModifiedCurrent;
   dv.Sort = “CompanyName DESC”;
  
   // Simple bind to a TextBox control
   Text1.DataBindings.Add(“Text”, dv, “CompanyName”);
}
2、通用接口IPassData

IPassData.GetSelectRowPrimaryKey()
IPassData.GetTable()

 

3、思路中断,理一下
            传过来的数据源  转化后的DataSource(用于显示)    直接获取用户选择数据行 转化后的所需的数据行 传回的数据
listView                   是一条条数据Add进去的              
  
DataGrid                   DataView(dataTable.DefaultView)

4、卡住了通用接口的实现—— 当感到比较疲惫就去休息一下 然后回来思考

using System;
using System.Data;

namespace CSHARPOLEDB3
{
 ///


 /// IPassData 的摘要说明。
 ///

 interface IPassData
 {
  int GetSelectRowPrimaryKey();
  DataTable GetTable();
 }

 public abstract class PassDataFactory
 {
  public static int PassTable = 0;
  public static int PassRow = 1;

  public static IPassData CreatePassData(int Type)
  {
   switch(Type)
   {
    case PassTable:
    {
     return new PassTable();
     break;
    }
    case PassRow:
    {
     return null;
     break;
    }
    default:
     throw new ArgumentException(“非法PassData类型!无法创建!”);
   }
  }

  
 }

 public class PassTable : DataTable,IPassData
 {
  public int GetSelectRowPrimaryKey()
  {
            return 0;
  }

  public DataTable GetTable()
  {
             return this;
  }
 }
}

以上代码编译没通过,提示Create()返回值要比IPassData访问性低。这里主要是interface 没有public造成的 修改语句interface IPassData 为public interface IPassData即可。同时switch语句中,Case后面需要一个常量,因此表示type的PassTable和PassRow应该定义为常量如public const int PassTable 否则通不过编译

2004年06月09日

http://soft.56kc.com/

http://community.csdn.net/Expert/topic/3077/3077889.xml?temp=.1964075

www.erist.com

重构工具

http://dotnetrefactoring.com/

http://www.blogcn.com/user8/flier_lu/index.html?id=1652203&run=blogcn

另外,今天在Flier’s Sky那里找到了一个.NET Refactoring for VS.NET的破解方法,
不过那个注册表路径有问题,应该是[HKEY_LOCAL_MACHINE\SOFTWARE\.NET Refactoring\C# Refactoring Tool]
“Key”=”Flier Lu”

2004年06月06日

http://www.aspsun.com/