租房子牢骚

  租房子被搞得很郁闷,折腾了大半个月,最后还是找了个3300一个月的,很无奈,无奈的都有点想哭,唉,其实男人是不能太过矫情的。
   晚上老爸老妈打电话问情况,一直在问钱够么,房子租得怎么样,很关心很溺爱的样子,当然自己也很体谅,也有点自责。其实父母都是很节约的人,好不容易我上班了,工作了,还得找父母要钱,还得租很贵而且很破的房子。
   再来说中介吧:本来我就是一个不怎么计较的人,既然是通过中介,那就中介吧。本来可以甩了中介,直接和房东签约的,可惜碍于信用,也就通过中介吧(当然,也顾虑到怕被骗的,不过房东广本都开了陪我去取钱了,这还有得假么)。最后数钱的时候,中介竟让把钱拿过去自己数了,生怕我不给钱她。唉。其实还有很多细节的东西,懒得说了。
   其实有些时候想想,有这个必要么?为了那么几千块钱,可以把一个人的价值观,人生观都扭曲成这样,很多时候大家都说从自己做起,但是自己如何对待别人,别人在利益面前又如何对待自己。很难,很难接受。不就几张花纸而已,何必呢,该是你的就是你的,不是你的你抢也抢不来的。(可能又有人要说,没有钱的时候你就不会这样想了)
   可能有些人会认为我是在这里租房子,感觉自己吃了亏在这里牢骚,就是一个不懂事的孩子,也许吧,反正是很不爽。当然,也可能是所谓的不成熟吧,也许有一天成熟了,我也就不会再有这样的牢骚了。
  

地球人都知道的模式抽象工厂模式(AbstractFactory

  

地球人都知道的模式–抽象工厂模式(Abstract Factory
  

    对于抽象的工厂模式,网络上都写了很多资料,其实个人学习了,感觉Terrylee大虾写的不错,很多东西我都是看他的学的,不过对于小弟粗浅的理解来看,还是觉得看petshop里面的代码容易理解。

    对于三层架构的网站来说,要想应对下层DAL的变化,也就是说,由于数据库的连接,以及增删改查这些功能,不同的数据库是不一样的,所以要想在不改变代码的情况下生成相应的类,来适应相应的需求的变化,这里利用了语言的一系列特性。当然,这里说的可能比较靠近于实现,其实对于抽象工厂的理解,还应该深入些。建议看Terrylee大虾写的。

    在petshop里面定义了一个专门的IDAL层,里面定义了几个实体类的接口,比如item接口他就定义了2个方法,一个是IListItemInfo> GetItemsByProduct(string productId); 一个是ItemInfo GetItem(string itemId);而具体的实现是在具体的DAL类里面,在PetShop里面,他支持两种数据库,分别写了两个DAL,一个是SQLServerDAL,一个是OracleDAL,这两个DAL都继承了IDAL这个接口,而里面自然是oracle的实现和sqlserver的实现。整个东西的精华,其实是在DALFactory里面

他的DataAccess类里面直接调用相应的方法来创建相应的实体。代码如下:
  

public sealed class DataAccess {

  

        // Look up the DAL implementation we should be using

  

        private static readonly string path = ConfigurationManager.AppSettings[“WebDAL”];

  

        private static readonly string orderPath = ConfigurationManager.AppSettings[“OrdersDAL”];

  

        private DataAccess() { }

  

        public static PetShop.IDAL.ICategory CreateCategory() {

  

            string className = path + “.Category”;

  

            return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);

  

        }

  

        public static PetShop.IDAL.IInventory CreateInventory() {

  

            string className = path + “.Inventory”;

  

            return (PetShop.IDAL.IInventory)Assembly.Load(path).CreateInstance(className);

  

        }

  

        public static PetShop.IDAL.IItem CreateItem()
{

  

            string className = path + “.Item”;

  

            return (PetShop.IDAL.IItem)Assembly.Load(path).CreateInstance(className);

  

        }

  

        public static PetShop.IDAL.IOrder CreateOrder() {

  

            string className = orderPath + “.Order”;

  

            return (PetShop.IDAL.IOrder)Assembly.Load(orderPath).CreateInstance(className);

  

        }

  

        public static PetShop.IDAL.IProduct CreateProduct() {

  

            string className = path + “.Product”;

  

            return (PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);

  

        }

  

}

  

里面的path和,orderPath都是从配置文件里面读取出来的,这里用到了ConfigurationManager类的一些方法,具体的可以查msdn,里面其实就是一个键和值的对应,通过键找相应的值,具体的你可以从web.config里面看到对应的情况,

  

add key=WebDAL value=PetShop.SQLServerDAL/>

  

实际上path里面储存的就是PetShop.SQLServerDAL而后面依据不同实体的创建的需求,加入了不同的类名,后面调用了反射,创建了相应的实体,让后返回了相应的接口。也就达到了依据配置文件的修改,来创建不同实体的需求。

  

这里有必要提下oracle的读取和sqlserver的语法不一样,而且产品本身的技术实现也不一样,毕竟是两个不同公司的不同产品。由于小弟用oracle时间不多,所以不能太多做评价,而且用的还是D板。对于企业开发来说,大型的一般都用oracle,因为毕竟是通过了iso的东西嘛。具体语法区别网络上写的很多,这里就不废话了。

预备知识反射。

说到模式,不得不说下c#里面的反射,正是利用了这种特性,很方便的实现了一些设计模式的想法。比如抽象工厂模式,不知道地球人看过微软4.0Petshop没,里面的抽象工场模式就是利用反射实现的。

 

具体什么是反射呢?百度搜索的解释是这样地:

反射(fanshe)在中枢神经系统参与下,机体对内外环境刺激所作出的规律性反应。反射活动的结构基础是反射弧。高等动物和人的反射有两种:一种是在系统发育过程中形成并遗传下来,因而生来就有的先天性反射,称非条件反射。它是由于直接刺激感受器而引起的,通过大脑皮质下各中枢完成的反射。另一种是条件反射,是动物个体在生活过程中适应环境变化,在非条件反射基础上逐渐形成的后天性反射。它是由信号刺激引起,在大脑皮质的参与下形成的。根据结构基础的不同,又可把反射分为简单和复杂的两种。最简单的反射是单突触反射。复杂的反射,是神经中枢分布较广,靠联络神经元组成复杂的链锁。反射是实现机能调节的基本方式。反射弧中任何一部位被破坏,反射就不能实现。由于突触在结构与功能上的特性,决定了反射弧上冲动的传导只能由感受器传向效应器。

 

哈哈,为了不使地球人看这个文章无聊,所以添加介绍点生物知识。活跃下大脑细胞。

 

其实反射是这样描述的:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从
现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

依据个人的肤浅了解,反射机制的采用在很大程度上依赖于.net 框架里面的metadata元数据,在受控代码编译以后生成的是metadata来描述元数据,所有的什么class,Delegate,Event interface,等这些东西都会加载相应的metadata到内存里面。当然,这些东西是存储在一个CLR-based编译器产生的module 里面的,这个东东加载就可以读到里面的东西,其优势是程序不加载也可以。可以把这些东西存到文件里面读出来(当让大多数时候还是程序编译的时候读的)。当我们读取metadata的过程,就是反射。

当然,这里又引出一个问题,就是广大公司面试的时候最喜欢考的一个题目,attributes(属性)property(性质)的区别。attributeproperty的字义上理解,attribute应该是"特性",汉语上理解特性就是与生具来的属性,所以有人把它理解成元属性“,”标签的意思(以和property区别)也是合适的,property就可以理解为是属性“–附加的性质;

attribute:修饰属性(定语)

property:是不同的属性(性质)

 

说白了,在.net里面

private string name;                  // C#中称为Field(字段),C++中称为Member Variable(成员变量),OOA/OOD中称为Attribute(属性)

    public string Name {                  // C#中称为Property(属性)

        get {

            return name;

        }

        set {

            name = value;

        }

    }

以上对那个私有字段的封装,添加了一个Name属性,通过对这个属性的访问,可以对私有字段name进行操作。这里就是所谓的propety

 

.net里面的attribute实际上是metadata描述的一类值,这种值是用来控制代码运行的方方面面,他可以被加入到class里面,也可以被加入到fields,methods里面,比如我们一般在类需要串行化的时候加入的[Serializable],还有在remoting时候创建的web service里面的方法前面的[WebMethod]描述。这些都是所谓的attribute

 

下面给出一个网络上和书上很常见的运用反射的例子:

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

 

namespace ReflectionTest

{

[Serializable]

    class Program

    {

        static void Main(string[] args)

        {

            Assembly assm = Assembly.LoadFrom(“ReflectionTest.exe”);

            Type[] mytypes = assm.GetTypes();

            foreach (Type t in mytypes)

            {

                Console.WriteLine(t.Name);

            }

            Type ht = typeof(HellowReflection);

            MethodInfo[] mif = ht.GetMethods();

            foreach (MethodInfo mi in mif)

            {

                Console.WriteLine(mi.Name);

            }

            Object obj=Activator.CreateInstance(ht);

            string[] s={“MyFunTest”};

            Object objname = Activator.CreateInstance(ht,s);

            BindingFlags flags=BindingFlags.Public;

            MethodInfo msayhi=ht.GetMethod(“MyFunTest”);

            msayhi.Invoke(obj,null);

            msayhi.Invoke(objname,null);

            Console.ReadLine();

        }

    }

}

——————————————————————————

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ReflectionTest

{

    class HellowReflection

    {

        string myName = null;

        public string MyName

        {

            get { return myName; }

            set { myName = value; }

        }

        public HellowReflection(string name)

        {

            myName = name;

        }

        public HellowReflection()

            : this(null)

        { }

        public void niub()

        {

            if (myName == null)

            {

                Console.WriteLine(“hello !!!”);

            }

            else

            {

                Console.WriteLine(“hello “ + myName.ToString());

            }

        }

    }

}

设计模式(开篇)

  最近老大叫搞sharepoint,很是复杂,一个程序调2天还没有通,真是郁闷,最近在看设计模式,就写点自己粗陋学习设计模式心得的文章吧,
  
  其实设计模式就是一个地球人所谓的经验传承,
  
  精华在于,
  1.找到变化封装之,
  2.优先使用对象聚集而不是继承,
  3.针对接口而不是实现设计.
  因为需求总在不断变化,所以高内聚,低耦合,用良好的适用性,来应对需求的变化.
  一个好的设计人员,总能在编码的时候根据需求来判断可能会更改的地方,进而采用适当的策略,来搞定设计.

所谓内聚:就是例程中操作之间联系的紧密程度,

所谓耦合:就是两个例程之间联系的紧密程度.

扎一看好像很模糊,不都是关联程度么?其实内聚性描述的是一个例程内部组成部分之间相互联系的紧密程度,而耦合描述的是一个例程和其他例程之间的联系紧密程度.应该不难明白,但是实际操作起来就比较麻烦,不过好在前人有经验,待我们后面详细学来.