Strategy 和 Policy,以及 Default
最近读到了一个单词 Strategy Model
,被翻译为“策略模式”,之前在阅读 《OSTEP》 的时候经常会有一个单词/概念:Policy
,中文翻译为“策略”、“协议”;而此处的 Strategy
也被翻译为了“策略”、作为一名英语学渣看到这种“一词多译”总是感觉疑惑。他们到底有啥区别???
策略?还是策略?
简单搜索下两个单词的定义其实答案就很明显了:
Strategy
更加侧重于一种“计划”和“过程”;而 Policy
则更加侧重一种“规定”和“原则”,像是一种顶层设计,从它的“协议”“政策”的两个翻译中可以很好的理解他们的区别。
在设计模式中的 Strategy Model
要求程序员可以通过统一的方式调用不同的算法(也就是Strategy
),从而降低耦合。但是在操作系统中的 Policy
则是一些必须要遵守的“原则”。
但有些也是让我摸不清头脑:
在内存替换时存在不同的策略:
FIFO
LRU
Optimal
在分配空闲内存时存在不同的策略:
Best Fit
Worst Fit
First Fit
在 OSTEP 中,内存替换章节使用了 Policy
进行描述,但是对于空闲内存分配则使用了 Strategy
(但是在后面的 Question
中又使用了 WORST fit policy
),让人有些捉摸不透,或许是他们的区别本来就不大?
英语好头疼
如果喜欢看一些经验贴的话,很容易会看到一句提醒:“多读原版书,读英文原著”。这个建议对我这种英语渣渣来说是十分抗拒的,但似乎也是不得不面对的事实,我们所涉及的计算机科学领域的基础大多都是基于英文的,在中文里也有诸如“拷贝”(Copy
)、“鲁棒”(Robust
)等音译而来的术语,尽管在长期的实践中已经成为了一种习惯,可很多术语存在“一词多译”或者是特殊用法,要准确的表达词语背后的意思,就会变得十分别扭。
中文和英文相互交织,感觉怪怪的,但也确实更准确一点。从前进程、线程傻傻分不清,但是 Process
& Thread
看一眼就能分得清楚;内存和存储到底是个啥?Memory
和 Storage
看上去就舒服一点了。
还有一个非常经典的翻译:“缺省”(Default
),脱离开语境看这个词,让人很摸不着头脑,但Default
还有另外一个翻译:“默认”。如果这么说,可能就会豁然开朗,“哦,原来是这个意思!”。
但真的是一个意思吗?
Default 到底是个啥
在文档中常看到某个属性包含一个 Default
,我们或许可以理解为这是某个属性的默认值。
这里理解为默认值自然是可以的,但我们再回顾一下各类计算机语言中常有的 switch
语句。
switch(expression){
case '+': cout<<"The operation is +.\n";break;
case '-': cout<<"The operation is -.\n";break;
case '*': cout<<"The operation is *.\n";break;
case '/': cout<<"The operation is /.\n";break;
default: cout<<"The operation is illegal.\n";break;
}
这里的 default
被称为“默认”是否还是准确的呢?
在学习这部分语法的时候老师提到的定义一般都是“当其他的 case 都不匹配的时候程序就会执行 default”,这似乎是默认,但又好像不是。
在 Java
中也有一个 Default Constructor
的概念。
在讲到继承一章的时候,wl 老师说编写程序的时候要养成自己声明无参的构造函数(no-arg constructor
)的习惯,不然容易引起程序报错。
当时其实并不理解这句话,“为什么会报错呢,程序不是会自动生成一个无参的构造函数吗?”,我们可以看一下这段代码:
class Father {
String name;
Father(String name) {
this.name = name;
}
}
public class Child extends Father{
Child()
{
}
}
在编译器中会报错:
报错的原因很简单,在子类的构造函数中第一行必须要为 super()
,如果用户没有写,则程序将会自动添加一个 super()
。报错原因就是调用 super()
的时候无法在父类中找到一个无参的构造函数。
“诶,不是有个默认生成的构造函数吗?怎么会报错呢?”
其实还是自己学艺不精,再回过头来看 Default Constructor
的定义:
这个
Constructor
的特别之处在于他是系统自动生成的,并且只有在用户没有显示定义构造函数的时候才会自动生成。
重点其实不是自动生成,而是自动生成的条件!
上面的代码片段,class Father
中包含了一个有参的构造函数,因此不满足 Default Constructor
的生成条件,造成了报错。
所以,Default
在这里真的是默认吗?
缺省!!!
还记得那个经典的翻译吗? 缺省!
“缺”或许可以理解为缺少,“省”或许可以理解为省略,则“缺省”就是表示缺少或者省略的情况。
再看 switch
和 constructor
中的 default
,是不是理解成 缺省 更加准确呢?
缺少可以匹配的 case
时调用这个语句;缺少显式的构造函数时 Default Constructor
就出现了!这不就是缺省所描述的状态吗!!
英语离我远点吧
讲了这么多,好像又没什么用,这种细枝末节的东西也没必要这钻牛角尖吧?看书的时候不还是该看看,该翻译翻译嘛哈哈哈。
回想起以前背单词时,为什么一个单词有这么多释义,为什么一个汉语词语有这么多表达方式,学起来真是头疼。现在想来,除了方块字和字母的区别,在这背后更多的是思维方式的区别吧?从语言再衍生到以此为基础的各个领域,当我们想要去跟上别人的脚步时,其实也在不自觉的改变着自己。
无法评价这种变化的好坏,就像编程普及后被常提及的“计算思维”,或许是跨越传统语言的一种思维方式,又或者说,其实还是建立在英语思维之上的一种更抽象、同时已经超越传统语言的的思维方式。冥冥之中又有些“音乐无国界”的韵味。
真正适合人类发展的思维其实是会在历史中被正确的筛选出来的吧?但自私点说,我还是希望学习的时候不再去考虑烦人的英语,安安心心的看我的方块字多好QAQ