Strategy 和 Policy,以及 Default

Strategy 和 Policy,以及 Default

最近读到了一个单词 Strategy Model ,被翻译为“策略模式”,之前在阅读 《OSTEP》 的时候经常会有一个单词/概念:Policy,中文翻译为“策略”、“协议”;而此处的 Strategy 也被翻译为了“策略”、作为一名英语学渣看到这种“一词多译”总是感觉疑惑。他们到底有啥区别???

策略?还是策略?

简单搜索下两个单词的定义其实答案就很明显了:

Strategy 更加侧重于一种“计划”和“过程”;而 Policy 则更加侧重一种“规定”和“原则”,像是一种顶层设计,从它的“协议”“政策”的两个翻译中可以很好的理解他们的区别。

在设计模式中的 Strategy Model 要求程序员可以通过统一的方式调用不同的算法(也就是Strategy),从而降低耦合。但是在操作系统中的 Policy 则是一些必须要遵守的“原则”。

但有些也是让我摸不清头脑:

在内存替换时存在不同的策略:

  1. FIFO
  2. LRU
  3. Optimal

在分配空闲内存时存在不同的策略:

  1. Best Fit
  2. Worst Fit
  3. First Fit

在 OSTEP 中,内存替换章节使用了 Policy 进行描述,但是对于空闲内存分配则使用了 Strategy(但是在后面的 Question 中又使用了 WORST fit policy),让人有些捉摸不透,或许是他们的区别本来就不大?

policy-in-OSTEP

strategy-in-OSTEP

policy-or-strategy

英语好头疼

如果喜欢看一些经验贴的话,很容易会看到一句提醒:“多读原版书,读英文原著”。这个建议对我这种英语渣渣来说是十分抗拒的,但似乎也是不得不面对的事实,我们所涉及的计算机科学领域的基础大多都是基于英文的,在中文里也有诸如“拷贝”(Copy)、“鲁棒”(Robust)等音译而来的术语,尽管在长期的实践中已经成为了一种习惯,可很多术语存在“一词多译”或者是特殊用法,要准确的表达词语背后的意思,就会变得十分别扭。

中文和英文相互交织,感觉怪怪的,但也确实更准确一点。从前进程、线程傻傻分不清,但是 Process & Thread 看一眼就能分得清楚;内存和存储到底是个啥?MemoryStorage 看上去就舒服一点了。

还有一个非常经典的翻译:“缺省”(Default),脱离开语境看这个词,让人很摸不着头脑,但Default 还有另外一个翻译:“默认”。如果这么说,可能就会豁然开朗,“哦,原来是这个意思!”。

但真的是一个意思吗?

Default 到底是个啥

在文档中常看到某个属性包含一个 Default,我们或许可以理解为这是某个属性的默认值。

default-in-document

这里理解为默认值自然是可以的,但我们再回顾一下各类计算机语言中常有的 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()
    {

    }
}

在编译器中会报错:

error-message-in-java-1

报错的原因很简单,在子类的构造函数中第一行必须要为 super(),如果用户没有写,则程序将会自动添加一个 super()。报错原因就是调用 super() 的时候无法在父类中找到一个无参的构造函数。

“诶,不是有个默认生成的构造函数吗?怎么会报错呢?”

其实还是自己学艺不精,再回过头来看 Default Constructor 的定义:

definition-about-default-constructor

这个 Constructor 的特别之处在于他是系统自动生成的,并且只有在用户没有显示定义构造函数的时候才会自动生成

重点其实不是自动生成,而是自动生成的条件!

上面的代码片段,class Father 中包含了一个有参的构造函数,因此不满足 Default Constructor 的生成条件,造成了报错。

所以,Default 在这里真的是默认吗?

缺省!!!

还记得那个经典的翻译吗? 缺省!

“缺”或许可以理解为缺少,“省”或许可以理解为省略,则“缺省”就是表示缺少或者省略的情况。

再看 switchconstructor 中的 default ,是不是理解成 缺省 更加准确呢?

缺少可以匹配的 case 时调用这个语句;缺少显式的构造函数时 Default Constructor 就出现了!这不就是缺省所描述的状态吗!!

英语离我远点吧

讲了这么多,好像又没什么用,这种细枝末节的东西也没必要这钻牛角尖吧?看书的时候不还是该看看,该翻译翻译嘛哈哈哈。

回想起以前背单词时,为什么一个单词有这么多释义,为什么一个汉语词语有这么多表达方式,学起来真是头疼。现在想来,除了方块字和字母的区别,在这背后更多的是思维方式的区别吧?从语言再衍生到以此为基础的各个领域,当我们想要去跟上别人的脚步时,其实也在不自觉的改变着自己。
无法评价这种变化的好坏,就像编程普及后被常提及的“计算思维”,或许是跨越传统语言的一种思维方式,又或者说,其实还是建立在英语思维之上的一种更抽象、同时已经超越传统语言的的思维方式。冥冥之中又有些“音乐无国界”的韵味。

真正适合人类发展的思维其实是会在历史中被正确的筛选出来的吧?但自私点说,我还是希望学习的时候不再去考虑烦人的英语,安安心心的看我的方块字多好QAQ

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇