以多态取代条件表达式

1.案例

话说最近直播很火嘛,反正我今天已经看了一晚上大胸了

我们看到,直播间里大致分为3类观众:

1.普通观众

2.房管

3.超管

如何区分这三种观众呢?我们发现,普通观众只显示自己的昵称,房管在自己的昵称前面还有一个醒目的“房管”标记,当然,超管的昵称前有个醒目的“超管”标记。看直播的都希望自己有个标记,因为这样才能装13啦...

2.条件表达式

现在,我们通过编写代码来区分这3种观众。

1.编写3个类。

class CommonAudience;	//普通观众
class HouseManager;		//房管
class SuperManager;		//超管

2.浏览器端用户登录之后,用一个成员变量标记用户身份。

string strUserType;	//用户类型

3.用户发送弹幕时,使用条件选择语句判断用户类型,决定使用何种标记方式

if (strUserType == "普通观众")
{
	//不充钱你还想装逼?
	commonAudience->showMark("");
}
else if (strUserType == "房管")
{
	houseMgr->showMark("房管");
}
else if (strUserType == "超管")
{
	superMgr->showMark("超管");
}

好了,我们想想,每次发弹幕都要判断,未免有点不好。

有什么办法可以避免判断呢?先观察这三个对象,普通观众、房管、超管,虽然类型不一样,但是有一定的联系,他们都是我们pandaTV的用户哦。

由此,在C++中,多态的作用就是根据对象的不同类型而采取不同的行为。

回顾一下多态的用法,声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。

3.多态

下面对代码进行重构:

1.创建一个用户基类

class User
{
	virtual void showMark();
};

声明一个用于发送弹幕时区分用户的函数,注意是虚函数,为什么要用虚函数请自行百度。

2.创建继承它的三个子类,实现showMark的不同内容

class CommonAudience : User
{
	void showMark(){ /*什么都不显示*/ }
};
class HouseManager : User
{
	void showMark(){ /*显示房管标记*/ }
};
class SuperManager : User
{
	void showMark(){ /*显示超管标记*/ }
};

3.用户登录后,根据用户类型,创建相应的用户对象

比如

User *user = new HouseManager;
user->showMark();

这样房管每次发送弹幕时,不用判断用户类型,只需调用showMark()函数,即可在昵称前显示“房管”2字啦!

使用多态取代条件表达式,并不说明你可以完全取代,“The conditionals are getting pushed up to the top of the chain.”。比如你在登录时,需要条件判断你是哪种用户。这样仅需判断一次,以后每次发送弹幕都无需再判断咯。

以上纯属娱乐!

时间: 2025-01-15 17:16:34

以多态取代条件表达式的相关文章

简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)

你手上一个条件表达式,它根据对象类型的不同而选择不同的行为.将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数. 动机:多态的最根本的好处是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写某些的条件表达式. 正因为有了多态,所以你会发现:“类型吗的switch语句”以及 ”基于类型名称的if-then-else语句“在面向对象程序中很少出现. 多态能够给你带来很多好处.如果同一组条件表达式在程序的许多地点出现,那么使用多态的收益是最大的.使用条件表达

重构-多态取代条件表达式

1 package refactoring; 2 3 /** 4 * @title Object oriented polymorphism 5 * @description 面向对象多态取代switch 6 * @author LZH 7 * @date 2016-8-2 下午10:48:51 8 */ 9 public class OOPReplaceSwitch { 10 11 public static void main(String[] args) { 12 13 int emplo

【重构学习】08 条件表达式的重构

所谓条件表达式,就是分支语句,去掉分支语句咯 1.分解条件表达式 修改点:你有一个复杂的条件语句(就是if else语句) 做法:将条件表达式的三个部分分别提炼出独立函数 即 if (A部分) { B部分; } else { C部分; } 这三个部分都提炼成函数就好了. 2.合并条件表达式 修改点:你有一系列测试,都得到相同结果 做法:将这些测试合并成一个条件表达式,并将这个表达式提炼成一个独立函数 3.合并重复的条件片段 修改点:在条件表达式的每个分支上有着相同一段代码 做法:将这段重复代码搬

重构摘要9_简化条件表达式

<重构-改善既有代码的设计>Martin Fowler 摘要: 第九章 简化条件表达式 Decompose Conditinal 分解条件表达式 你有一个复杂的条件(if-then-else)语句 从三个段落中分别提炼出独立函数 Consolidate Conditional Expression 合并条件表达式 你有一系列条件测试,都得到相同结果 将这些测试合并成为一个条件表达式,并将这个条件表达式提炼成为一个独立函数 检查用意更清晰,有时也不用这么做 Consolidate Duplica

简化条件表达式

1.分解条件表达式:a.将判断条件独立函数:b.将分支段落独立函数: 2.合并条件表达式:a.使用逻辑或/与:b.三元表达式 3.合并重复的代码片段 4.移除控制标记:a.找出对标记变量赋值的语句,代之break或continue:b.extract method,以return返回控制标记 5.以卫语句取代嵌套条件表达式: 精髓:给某一条分支以特别的重视 比较:if-then-else则是同等重要 方式:将条件反转,最后考虑去除零时变量 6.以多态取代条件表达式: a.extract meth

学习重构(5)-简化条件表达式

1.Decompose Conditional (分解条件表达式)应用场景:你有一个复杂的条件(if-then-else)语句.从if.then.else三个段落中分别提炼出独立函数.示例:if (date.before(SUMMER_START) || date.after(SUMMER_END)) { charge = quantity * mWinterRate + mWinterServiceCharge;} else { charge = quantity * mSummerRate;

Simplifying Conditional Expressions(简化条件表达式)

1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplicate Conditional Fragments(合并重复的条件片段) 4.Remove Control Flag(移除控制标记) 5.Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式) 6.Replace Conditiona

简化条件表达式之以卫语句取代嵌套条件表达式(Replace Nested Conditional With Guard Clauses)

函数中的条件逻辑使人难以看清正常的执行途径.使用卫语句表现所有特殊情况. 动机:条件表达式通常有2种表现形式.第一:所有分支都属于正常行为.第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况. 这2类条件表达式有不同的用途.如果2条分支都是正常行为,就应该使用形如if…..else…..的条件表达式:如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回.这样的单独检查常常被称为“卫语句”. Replace Nested Conditional with

重构改善既有代码的设计--简化条件表达式

一 简化条件表达式 这个是几乎所有的工程都会存在的问题,不当的条件表达式造成代码的冗余. 下面我们列出普遍的问题,并给出一般的应对方法. [1]条件判断过长,表达不清晰. if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])) { .... } 解决办法:将很长的判断式子封装成函数或者定义成宏.并以一个清晰表达意图的名字命名,这种做法在现代oop语言中很常见,比如 java c#