gpt4 book ai didi

javascript - 当我们需要修改上下文类时实现策略模式

转载 作者:行者123 更新时间:2023-11-28 00:56:59 25 4
gpt4 key购买 nike

我有一个包含位数组(“基因”)的 Genome 类,我想实现不同的突变方法来更改基因。我目前正在使用策略模式实现突变方法,但突变方法直接更改 Genome 类。

如果我将基因数组传入策略并直接修改数组(naiveMutationStrategy),这是否考虑破坏封装?我正在阅读一些论点,认为策略模式不应修改调用它的上下文的状态?

如果我直接传入 Genome 类 (naiveMutationStrategy2) 会怎么样 - 我认为这是一个禁忌,因为策略模式不应存储对上下文对象的引用?

function Genome(genes, mutationStrategy) {
this.genes = genes; //an array
this.mutationStrategy = mutationStategy;
}

Genome.prototype.mutate = function() {
this.mutationStategy.execute(this.genes);
}

function naiveMutationStrategy() {};

//converts '1' into '0' and vice versa
mStrategy.prototype.execute = function(genes) {
_.each(genes, function(element) {
if (element === '0') {
element = '1'
} else element = '0';
});
};

function naiveMutationStrategy2() {};

//converts '1' into '0' and vice versa
naiveMutationStrategy2.prototype.execute = function(genome) {
_.each(genome.genes, function(element) {
if (element === '0') {
element = '1'
} else element = '0';
});
};

最佳答案

I'm currently implementing the mutation method using a Strategy Pattern

好主意,但不要试图过于接近地重现您为基于类的语言所学到的模式。您的策略构造函数是空的 - 它们是不必要的(除非您想要某种“StrategyFactory”)。即使那些原型(prototype)对象及其方法也是不必要的,它们只有一个方法。

JavaScript 是一种函数式语言,具有一流的函数对象。在函数式语言中,“策略”只是一个函数。传递函数,而不是策略实例。

but the mutation method changes the Genome class directly.

并非如此 - 它不会分配给 Genome 实例的属性。它所做的只是改变它所通过的参数,这(或多或少)没问题。

Is this consider breaking encapsulation if I pass in the genes array into the Strategy and it modifies the array directly (naiveMutationStrategy)?

没有。合约是“策略需要一个数组参数”和“策略可能会修改其参数”——如果您不喜欢后者,则可以使用不同的合约。真正破坏封装的是策略通过了 Genome 实例并从外部修改其属性。只要您的 mutate 方法控制正在发生的事情,我就看不到问题。

I was reading some arguments that the Strategy pattern should not modify the state of the context calling it?

是的,这确实是个好主意。如果基因是不可变的,并且该策略确实创建了新的基因序列,那么您的代码将会受益。

_.each(genes, function(element) {
if (element === '0') {
element = '1'
} else element = '0';
});

请注意,您实际上并没有在这里改变任何内容。 element 是一个局部变量,而不是对数组元素的引用。如果你真的想改变数组,你可以使用

for (var i=0; i<genes.length; i++)
if (genes[i] === '0')
genes[i] = '1'
else
genes[i] = '0';

如果你想创建一个新序列,你可以使用

return _.map(genes, function(element) {
return (element === '0') ? '1' : '0';
});

关于javascript - 当我们需要修改上下文类时实现策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com