类方法调用设计为类属性还是传参好?

1.从封装角度看。这样的方法签名,表达能力不强,没交代清楚输入,调用者需要了解被调用代码细节,才能知道需要给哪些属性赋值。如果不同程序集,不同人员一同开发会有不小沟通障碍,一旦被调用方法参数有变要通知调用方,否则可能出现bug。

2.从接口角度看。基于第一点,很难形成接口,因为接口功能之一是定义输入输出的规范。
3.从维护角度看。
首先,代码是你自己写的,自然觉得问题不大,但是如果别人来做代码的维护,单看调用不看被调用方法的代码细节,确实不知道怎么改。其次,如果被调用方法所需参数数量发生变化时,那么调用代码的对象实例的属性需要相应的新增和修改,这个做不到自动重构,需要查找引用,然后手工一个个改,可能存在漏改;如果不改,多余的属性赋值显然会影响以后阅读。如果是指明参数个数和类型,起码编译的时候可以报错。
4.从隐藏Bug角度看。基于第三点,如果被调用方法体内部对参数使用个数等的修改,然后,调用没有同步修改,可能隐含造成bug(方法体新增参数的时候,调用没有同步新增属性的赋值)。
5.从泛型编程角度看。这样子的设计,难用泛型来编程,因为你需要给具体类型的具体属性赋值后才调用方法。

如果按照这样的思路,我一般更倾向于使用实体类作为参数。例如:

//以下DAO
public IDAO<TEntity> where TEntity : EntitieBase, new()
{
Add(TEntity);
Update(TEntity);
}

public abstract class DAOBase<TEntity, TDataContext> : IDAO<TEntity>
        where TEntity : EntitieBase, new()
        where TDataContext : DbContext, new()
{
protected TDataContext dataContext;

public TDataContext DataContext
        {
            get { return dataContext; }
        }

Add(TEntity)
{   
DataContext.Add(TEntity);
TEntity.ID = Guid.newd.tos();

}
}

public class DaoUser : DAOBase<User, EFEntities>

//以下BO
public abstract class BOBase<TEntity, TIDAO> 
        where TEntity : EntitieBase
        where TIDAO : IDAO<TEntity>
{
protected ICacheManager CacheManager;
protected ILogManager LogManager;
protected ITranstionManager TranstionManager;

protected <T>ServiceLocator
{
//ioc容器
}

private TIDAO dao;

public TIDAO Dao
        {
            get 
            set 
        }

Add(TEntity)
{
Dao.Add(TEntity);
}
}

public class BoUser : BOBase<User, DaoUser>

来源: <http://bbs.csdn.net/topics/390891258>

来自为知笔记(Wiz)

时间: 2024-10-10 05:33:09

类方法调用设计为类属性还是传参好?的相关文章

Java自学-类和对象 传参

Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 public class Hero { String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public Hero(){ } //回血 public void huixue(int xp){ hp = hp + xp

php调用java写的WebService不能传参问题解决

前言:  刚刚做了一个事,php调java的soap接口,但是并没有什么文档,只有看以前写的java调用用来写.所以java是可以正常调用的,出现的问题是php能调到接口,但是接收不了参数. 开始没看懂那个java调用,设置targetNamespace是什么鬼,翻遍了php手册,吧英文翻译过来看了才知道,SoapVar对应了soap数据的封装. 网上收了,发现他们都在乱答.浪费我时间,还不如自己看手册. 问题出在:命名空间 java soapClient:  /**  * saleOrderI

2016.11.03 1.优化拼接SQL 2.类里面的属性 不传参方法里也可以直接用

string Url = string.Format("{0}/api/sms/v1/s?t={1}&n={2}&m=[{3}]短信:{4}", MainUrl, ApiToken, PhoneNumber, ApiLogo, Content); 用占位符的方法比拼接SQL来的更好 -----------------------------------------------------------------------------------------------

angular自定义指令在指令里面调用父作用域里面的方法传参

使用自定义指令的时候在指令里面调用父作用域里面的方法,在指令里面 在父作用域里面的模板里面使用指令 在控制器里面

quartz定时任务_job实现类中获取传参02

1.main方法: public static void main(String[] args) throws SchedulerException { // TODO Auto-generated method stub // 创建一个JobDetail实例 将HelloJob类添加到JobDetail中 JobDetail jobDetail = JobBuilder.newJob(helloJob.class) .withIdentity("myJob", "jobDe

Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在python2.x中,若没指定父类,则不会以object作为基类. 2)旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号. 3)dir方法是用来查看类的内置方法. 二.私有方法和属性 1)私有属性是对象不希望公开的属性:私有方法是对象不希望公开的方法.在定义私有属性和方法时,在属

python 类属性、静态方法与类方法

1. 类属性 1.1 定义 在类中方法外通过属性名 = 属性值定义的属性 访问方式: 类名.属性名 对象名.属性名 class Student: cls_id = 102 stu = Student() print(Student.cls_id) print(stu.cls_id) print("---------") Student.cls_id = 103 print(Student.cls_id) print(stu.cls_id) print("---------&q

Python3.x基础学习-类--类属性和实例属性

类属性和实例属性 定义: 实例属性:在实例对象中定义的属性类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性类属性使用方式:类名.类属性,也可以使用 对象.类属性注意: 1.不可变类型:对象名.属性名=属性值 是给对象添加属性,而不是进行修改 2. 可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改如果是重新给可变数据类型变量赋值,这是给该对象添加属性 class Dog: pass dog=Dog dog.name = '旺财' print(dog.name) dog.

vue路由传参页面刷新参数丢失问题解决方案

最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$router.push({ name:"admin", //这里的params是一个对象,id是属性名,item.id是值(可以从当前组件或者Vue实例上直接取) params:{id:item.id} }) //这个组件对应的路由配置 { //组件路径 path: '/admin', //