返回信息流看了书中运用命令模式解决“ 温室的运作 ”的例子,想想如果组里接到一个这样的项目,肯定每个人分别负责灯光、水、温度等模块的编写,实现。即使想使用命令模式,也没有机会啊。。。。。
这是一条镜像帖。来源:北邮人论坛 / java / #31226同步于 2014/7/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
今天看了编程思想的命令模式感觉很惆怅。。。。
iambest
2014/7/30镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
不见得吧,软件工程很忌讳把紧密耦合的几个东西分给多个人写。正确的分工是一个人写所有的主要代码,另一个人写一个不太影响功能的扩展,另一个人……真的需要三个人吗?两个人都搞不定?软件工程两个人已经很多了,真有两个人的话可能需要坐在一起高频率地交谈保持同步。真有第三个人的话,帮忙搭一个版本控制器服务器端,安装一个gitlab网页界面,安装一个持续集成(Continuous Integration)工具,写写备份脚本,再打打杂什么的……
【 在 nuanyangyang 的大作中提到: 】
: 不见得吧,软件工程很忌讳把紧密耦合的几个东西分给多个人写。正确的分工是一个人写所有的主要代码,另一个人写一个不太影响功能的扩展,另一个人……真的需要三个人吗?两个人都搞不定?软件工程两个人已经很多了,真有两个人的话可能需要坐在一起高频率地交谈保持同步。真有第三个人的话,帮忙搭一个版本控制器服务器端,安装一个gitlab网页界面,安装一个持续集成(Continuous Integration)工具,写写备份脚本,再打打杂什么的……
我们现在的情况的是接到一个项目,每个人直接数据库建表,mvc把各自模块做了,基本不考虑两个模块可以集成到一个模块来做。。。
【 在 iambest 的大作中提到: 】
:
: 我们现在的情况的是接到一个项目,每个人直接数据库建表,mvc把各自模块做了,基本不考虑两个模块可以集成到一个模块来做。。。
别告诉我这项目这么好分割。
【 在 nuanyangyang 的大作中提到: 】
:
: 别告诉我这项目这么好分割。
就这个温室控制的例子吧,做起来又是灯光控制模块,水源控制模块等等,不知你开发的时候有没有经常使用这些开发模式啊,估计也是我刚编程不久,组里开发也没用到过这些模式。。。。
【 在 iambest 的大作中提到: 】
:
: 就这个温室控制的例子吧,做起来又是灯光控制模块,水源控制模块等等,不知你开发的时候有没有经常使用这些开发模式啊,估计也是我刚编程不久,组里开发也没用到过这些模式。。。。
我还真没用过命令模式。
【 在 iambest 的大作中提到: 】
看了书中运用命令模式解决“ 温室的运作 ”的例子,想想如果组里接到一个这样的项目,肯定每个人分别负责灯光、水、温度等模块的编写,实现。即使想使用命令模式,也没有机会啊。。。。。
仔细看了看这个模式。但这个模式的本意是为了解决命令的执行和命令的定义不在同一个时间或者不在同一个地点完成的问题。核心是用对象表示动作。
没有专门地用过这个模式,但是做过很多类似的事情。
class Light {
private boolean on = false;
public boolean isOn() { return on; }
public void turnOn(){ on = true; }
public void turnOff() { on = false; }
}
class AirConditioner {
void int temperature = 20;
public int getTemperature() { return temperature; }
public void setTemperature(int temperature) { this.temperature = temperature; }
}
class Main {
public static void main(String[] args) {
final Light light = new Light();
final AirConditioner ac = new AirConditioner();
List<Runnable> commands = new ArrayList<Runnable>();
// 虽然没定义“command”接口也没定义具体子类,但明显这些匿名内部类都是“命令”
commands.add(new Runnable() { @Override public void run() {
light.turnOn();
}});
commands.add(new Runnable() { @Override public void run() {
ac.setTemperature(27);
}});
commands.add(new Runnable() { @Override public void run() {
light.turnOff();
}});
commands.add(new Runnable() { @Override public void run() {
ac.setTemperature(24);
}});
for(Runnable cmd : commands) {
cmd.run();
}
}
}
用函数式语言的时候可能感觉不到自己在用命令模式,因为“闭包”就是“命令”。下面这件事是我最近真的做过的:
class Light{
var on = false
def turnOn() { on = true }
def turnOff() { on = false }
}
class AC {
var temperature = 25
}
import scala.collection.mutable.ArrayBuffer
object Main extends App {
var light = new Light()
var ac = new AC()
// 我就是想让这些事情等一会儿再做,不是现在就做。
object later {
val jobs = new ArrayBuffer[ () => Unit]()
def apply(f: => Unit) {
jobs += {() => f}
}
def doAll() {
for (j <- jobs) j()
}
}
// 不觉得这些是“命令”,只是像一些块。但其实这些就是命令。里面带着light、ac对象的引用以及该执行的代码。
later {
println("Let's turn on the light")
light.turnOn()
}
later {
println("but not too cold")
ac.temperature=27
}
later {
println("turn off the light")
light.turnOff()
}
later {
println("reduce temperature")
ac.temperature=24
}
println("Let's do it now!")
later.doAll()
println("Done.")
}