面相对象 类设计
面向对象 类设计 小结
1.用属性还是共有字段?
(如果用不到Set和Get控制那么属性也就没有什么意义了,毕竟属性也只是两个方法Set()和Get()而已。从面相对象来看,将成员变量用属性封装则较为
规范。)
2.方法需要的信息写在方法参数里还是存在类的成员变量里?
根据实际需求。根据代码可读性。根据安全性。
(1)如果存储在成员变量里,则必须在方法调用之前对变量赋值。(方法参数是每次调用都需要传值。废话。)另外,如果条件变化了则需要即时改变成员变量的值,或者重
新new一个对象。这就要考虑方法的使用情况了。如果方法需要的参数变化频繁,那么声明一个带参数的方法会很合理。
(2)如果以方法参数形式,则代码有较好的可读性,该方法很透明。但是如果其他模型需要访问这个方法调用的参数,那这个时候就需要使用成员变量了。
(3)如果即声明变量,又将方法加上参数,那么调用时类似:a.Fun(a.Member);另外可以加上重载,直接a.Fun();这样即可以访问到Member又可以很轻松地使用值不用的
Member调用Fun(member类型的参数);
(最后)从面相对象角度来说,一个模型拥有某些特性,那么这些特性一定值得该模型拥有。根据实际模型的风格、特点不同考虑方法的透明性。方法太过透明则有悖于封装
的思想。
3.属性是什么?何时用?为什么?(C#特有的东西,在Java和C++中没有,要写自己的Set()和Get()方法。在.net体系中属性就是当方法看待的)
4.使用静态成员还是实例成员?还是静态类??
5.结构体?
一个类,可拥有较多的属性,和若干个拥有较多参数的构造函数,这样,类的方法就可以有很少的或没有参数。(适用于类本身和其他类关联性不强,以对象的构造为主,只使用
一次或很少使用对象的方法,如:MyInstance.Save();)如果类的方法调用了类的其他成员,则最好在类构造时就使这些被调用的成员有效。例如在构造函数中给成员变量赋值。
写代码时当一个方法调用了类的变量成员则马上在成员变量后加上注释:被FunA()调用
相反,一个类可以只有很少的属性或没有属性,构造函数可以无参数或有少量参数,而类的方法则拥有较多的参数。(适用于方法使用频繁,方法参数多变的情况。这样不至于每
次都需要更改对象的属性或重新new一个对象出来。如:MyClass.WriteFile(fillPath,fileContent,charset,overrwirte,buffer,maxLength))如果允许,可以考虑静态(类)方
法。
当类MyClass调用类A
class A
{
public voi Fun1(int i);
}
1.
class MyClass
{
public void MyFun(A a,int i)
{
a.Fun1(i);
}
}
2.
class MyClass
{
public A MyA {set;get;}
public void MyFun(int i)
{
MyA.Fun1(i);
}
}
3.
class MyClass
{
public A MyA {set;get;}
public int MyI{set;get;}
public void MyFun()
{
MyA.Fun1(MyI);
}
}
4....
构造函数的情况
1.构造函数无参,先new,然后为对象属性赋值,这样在方法内需要判断需要的信息、数据是否完整、合法
class MyClass
{
public A MyA {set;get;}
public int MyI{set;get;}
public MyClass(){}
public void MyFun()
{
if(null!=MyA && null!=MyI)
MyA.Fun1(MyI);
else
throw new ArgumentException("");
}
}
调用:
MyClass m=new MyClass();
m.MyA=new A();
m.MyI=1;
m.MyFun();
//条件改变
m.MyI=0;
m.MyFun();
2.构造函数提供参数实现对象完整或部分构造,这样方法可以少量判读或放心写实现
class MyClass
{
public A MyA {set;get;}
public int MyI{set;get;}
public MyClass(A _a,int _i)
{
this.MyA=_a;
this.MyI=_i;
}
public void MyFun()
{
MyA.Fun1(MyI);
}
}
调用:
MyClass m=new MyClass(new A(),1);
m.MyFun();
//条件改变
MyClass m=new MyClass(new A(),0);
m.MyFun();
或
m.MyI=0;
m.MyFun();
3.强大版本
class MyClass
{
public A MyA {set;get;}
public int MyI{set;get;}
public MyClass(){}
public MyClass(A _a,int _i)
{
this.MyA=_a;
this.MyI=_i;
}
public void MyFun()
{
if(null!=MyA && null!=MyI)
MyFun(MyA,MyI);
else
throw new ArgumentException("");
}
public void MyFun(A _a,int _i)
{
_a.Fun1(_i);
}
}
4.....
当发现大量的对象之间引用拥有复杂的树形或甚至网状关系时,因为类本身是一个模型,类的设计是设计一个模型,应尽量考虑设计一个干净的,无关联的,纯粹的类。
既然是面相对象的思想,那么要时刻提醒自己:面相对象。封装、继承、多态。类的设计是在建立一个模型。