C#中啥叫接口隔离原则?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中啥叫接口隔离原则?相关的知识,希望对你有一定的参考价值。
接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。接口隔离原则
不应该强迫客户端依赖于他们不会使用的接口。
实例
下面是一个违反了接口隔离原则的例子。我们使用Manager类代表一个管理工人的管理者。有两种类型的工人:普通的和高效的,这两种工人都需要吃午饭。现在来了一批机器人,它们同样为公司工作,但是他们不需要吃午饭。一方面Robot类需要实现IWoker接口,因为他们要工作,另一方面,它们又不需要实现IWorker接口,因为它们不需要吃饭。
在这种情况下IWorker就被认为是一个被污染了的接口。
如果我们保持现在的设计,那么Robot类将被迫实现eat()方法,我们可以写一个哑类它什么也不做(比如说它只用一秒钟的时间吃午饭),但是这会对程序造成不可预料的结果(例如管理者看到的报表中显示被带走的午餐多于实际的人数)。
根据接口隔离原则,一个灵活的设计不应该包含被污染的接口。对于我们的例子来说,我们应该把IWorker分离成2个接口。
3. interface IWorker
4. public void work();
5.
6. public void eat();
7.
8.
9. class Worker implements IWorker
10. public void work()
11. // ....working
12.
13.
14. public void eat()
15. // ...... eating in launch break
16.
17.
18.
19. class SuperWorker implements IWorker
20. public void work()
21. //.... working much more
22.
23.
24. public void eat()
25. //.... eating in launch break
26.
27.
28.
29. class Manager
30. IWorker worker;
31.
32. public void setWorker(IWorker w)
33. worker=w;
34.
35.
36. public void manage()
37. worker.work();
38.
39.
// interface segregation principle - bad example
interface IWorker
public void work();
public void eat();
class Worker implements IWorker
public void work()
// ....working
public void eat()
// ...... eating in launch break
class SuperWorker implements IWorker
public void work()
//.... working much more
public void eat()
//.... eating in launch break
class Manager
IWorker worker;
public void setWorker(IWorker w)
worker=w;
public void manage()
worker.work();
下面是遵循接口隔离原则的代码。通过把IWorker分离成两个接口,Robot类不需要再被强迫实现eat()方法。如果我们需要为Robot类添加其他的功能,例如重新充电,我们可以创建一个新的IRechargeable接口,其中包含一个重新充电的方法recharge。
Java代码 复制代码
1. //interface segregation principle - good example
2.
3. interface IWorkable
4. public void work();
5.
6.
7. interface IFeedable
8. public void eat();
9.
10.
11. class Worker implements IWorkable, IFeedable
12. public void work()
13. // ....working
14.
15.
16. public void eat()
17. //.... eating in launch break
18.
19.
20.
21. class SuperWorker implements IWorkable, IFeedable
22. public void work()
23. //.... working much more
24.
25.
26. public void eat()
27. //.... eating in launch break
28.
29.
30.
31. class Robot implements IWorkable
32. public void work()
33. // ....working
34.
35.
36.
37. class Manager
38. IWorkable worker;
39.
40. public void setWorker(IWorkable w)
41. worker = w;
42.
43.
44. public void manage()
45. worker.work();
46.
47.
//interface segregation principle - good example
interface IWorkable
public void work();
interface IFeedable
public void eat();
class Worker implements IWorkable, IFeedable
public void work()
// ....working
public void eat()
//.... eating in launch break
class SuperWorker implements IWorkable, IFeedable
public void work()
//.... working much more
public void eat()
//.... eating in launch break
class Robot implements IWorkable
public void work()
// ....working
class Manager
IWorkable worker;
public void setWorker(IWorkable w)
worker = w;
public void manage()
worker.work();
总结
如果已经设计成了胖接口,可以使用适配器模式隔离它。
像其他设计原则一样,接口隔离原则需要额外的时间和努力,并且会增加代码的复杂性,但是可以产生更灵活的设计。如果我们过度的使用它将会产生大量的包含单一方法的接口,所以需要根据经验并且识别出那些将来需要扩展的代码来使用它。 参考技术A 是使程序的各个功能隔离开,不强迫客户程序使用他们用不到的功能。
见意你弄本讲解设计模式的书看看。 参考技术B 尽可能地, 接口与实现的耦合度.达到最小. 参考技术C 学习
西门子PLC中啥叫PID指令啊?
请问有谁能告诉我PID指令是什么意思?
PID(比例+积分+微分)算法控制。
PID回路指令,对模拟量进行PID控制十分方便。PID指令使用的算法:( n SP 为第n个采样时刻的给定值,n为过程变量值,MX 为积分项值)PID 指令根据表格(TBL)中的输入和配置信息对引用LOOP执行PID 循环计算。
在实际控制过程中,无论是给定量还是过程量都是工程实际值,它们的取值范围都是不相同的。因此在进行PID运算前,必须将工程实际值标准化。PLC 在对模拟量进行PID运算后,对输出产生的控制作用是在[0.0,1]范围的标准值,不能驱动实际的驱动装置,必须将其转换成工程实际值。
扩展资料
PID的特点
1、PID应用范围广
虽然很多工业过程是非线性或时变的,但通过对其简化可以变成基本线性和动态特性不随时间变化的系统,这样PID就可控制了。
2、PID参数较易整定
也就是,PID参数Kp,Ti和Td可以根据过程的动态特性及时整定。如果过程的动态特性变化,例如可能由负载的变化引起系统动态特性变化,PID参数就可以重新整定。
3、PID控制器在实践中也不断的得到改进
PID在控制非线性、时变、耦合及参数和结构不确定的复杂过程时,工作得不是太好。最重要的是,如果PID控制器不能控制复杂过程,无论怎么调参数都没用。
参考资料来源:百度百科—PID控制
参考技术A PID指比例积分微分,Proportion比例,Integration积分,Differentiation微分西门子PLC编程软件中有PID向导,程序中的PID程序块可利用s7-Micro/win程序中的“工具”→“指令向导”生成。根据向导的提示可以对死区、报警、手动等功能进行选择,可以对设定范围、P、I、D等参数进行设定(完成后还可以利用向导进行更改)。根据提示完成设定后会自动生成一个子程序和一个中断程序,在主程序或其他程序中调用PID子程序就可以实现PID调节功能。需要更详细的说明可以直接察看编程软件的帮助文档,那里说明的还是比较详细的。
PID控制说明:
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
比例(P)控制 :比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差。
积分(I)控制 :在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制 :在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。
西门子PID各参数的解释
COM_RST :=初试化
MAN_ON :=手动
PVPER_ON:=过程变量外设接通
P_SEL :=比例分量接通
I_SEL :=积分分量接通
INT_HOLD:=积分分量保持
I_ITL_ON:=积分分量初始化接通
D_SEL :=微分分量接通
CYCLE :=采样时间
SP_INT :=内部设定值
PV_IN :=过程变量输入
PV_PER :=过程变量外设输入
MAN :=手动值
GAIN :=比例增益
TI :=复位时间
TD :=微分时间
TM_LAG :=微分分量的滞后时间
DEADB_W :=死区宽度
LMN_HLM :=被控量上限
LMN_LLM :=被控量下限
PV_FAC :=过程变量系数
PV_OFF :=过程变量偏移量
LMN_FAC :=被控量系数
LMN_OFF :=被控量偏移量
I_ITLVAL:=积分分量初始值
DISV :=干扰变量
LMN :=被控量
LMN_PER :=被控量外设
QLMN_HLM:=被控量上限值到达
QLMN_LLM:=被控量下限值到达
LMN_P :=比例分量
LMN_I :=积分分量
LMN_D :=微分分量
PV :=过程变量
ER :=误差信号本回答被提问者采纳 参考技术B 好像是s_otd吧?这个是西门子的延时接通计时器指令,一般都是指令上测都是填t1-t255,不能是别的
预设值时间应该是s5#time
2s等格式的。一般在多重调用的功能块是不能用这个指令的,都用ton(库文件里边的)。因为这个是系统固有的定时器,好像只有255个!慎用!! 参考技术C 您是不懂PID的含义吗?
PID是一种闭环控制方式。P代表比例调节,影响系统的快速性;I代表积分调节,消除系统的稳态误差;D代表微分调节,对系统的状态有一个预测的作用(一般不用,条不好的话会造成系统震荡)。
我不知道您说的PLC是S7-300吗?它是调用FB41实现PID的。
希望我的解释对您有所帮助 !
以上是关于C#中啥叫接口隔离原则?的主要内容,如果未能解决你的问题,请参考以下文章