“我的灯是一面镜子! -说,给我看我的双重身份……”:设计一个好的框架,然后将第二个作为礼物

古代寺庙的石头会说话,但很少有人注意。 宇宙充满了人类无法听到的声音。 我们看不到的颜色:有时是身体和精神的客观限制,但也有主观原因-缺乏知识和技能或无法在日常练习中使用它们。 程序设计领域第二个生动的例子-函数签名。 面向对象世界的孩子充其量是在界面中思考-它很接近,但是“不完全是”,并且您变得越专心,它就会变成“根本不”。 而且功能签名也知道如何交谈。

老实说,我想从真正的高级抽象开始,但是我以前的经验表明,即使是非数学语言中最简单的数学真理也不会“听起来”。 顺便说一句,我注意到我所谈论的一切都源于数学思想,因此可以严格地形式化。
现在-具体内容。 至少一次,GoF的划时代的工作可能或多或少地使“翻箱倒柜”变得麻烦; 可能甚至“不粘手”的人也知道存在这种模式-迭代器。 当然,每个人每天都在使用它。 因此(坚持条件C#):

bool MoveNext(); T Current { get; } 

...现在又是同一件事,但没有句法噪音(这表明实际上“无句法噪音”对Haskell意味着):

 MoveNext :: () -> Bool Current :: () -> t 

...暂时忘记类型,只关注箭头本身(->),您不由自主地提出了一个问题,如果“反转”会发生什么? 然后结果是:

 MoveNext' :: Bool -> () Current' :: t -> () 

有点不和谐感,对吗? 如果t->()没有问题,那么Bool->()看起来可疑得多。 确实-这个标志是用来表示序列结束的,对吗? 在倒置形式中,情况True->()没有任何意义-仅False->()就足够了。 Bool类型提供的二进制不确定性丢失了-因此它看起来应该像这样:

 completed :: () -> () next :: t -> () 

看起来不一样吗? 反应性扩展又如何呢?
哇! 一个(几乎)很酷(微型)框架的功能的签名(嗯,更准确地说,是签名,但是方法本身在单个级别上起作用)告诉了我们另一个同样酷的框架,对吗? 您只需要小心并听到。

范畴论对世界的好消息
当然,谁是这个主题的人都知道IEnumerator <-> IObserver的示例并不新鲜。
令人惊讶的是,很少有人意识到这与唯一的例子相去甚远(尽管我们必须致敬,特别是这个例子非常有意思)。

好奇的人可以采用其余的GoF模式并查看其对偶。 通常,完全是胡说八道-这是正常的:“双重性”本身高于尘世世界,并不认为自己有义务实际使用:但是,毕竟,太阳也不需要人类发光。

为什么然后“几乎很酷”? 是的,因为不和谐导致需要进一步研磨和切割。 严格来说,将箭头转回去,结果发现有些用处不大,这可以解释为原始签名的缺点。 展望未来,我要说的是,可以重新定义这种独特的签名,以使不和谐消失,转向双重符号非常简单。 但是,我至少不会对此感到烦恼-不在本说明中。

最好根据我的经验进行总结:

  1. 函数签名可以说,但是程序员通常是聋的。
  2. 每当您遇到设计良好的功能时,都要问自己它的双重功能是什么,以及它是否对任何任务都有用。
  3. 如果存在双重特征,但需要如上例中的“轻微修改”,则原始签名很可能具有一些隐式缺陷;例如, 也许重新定义它才有意义,这样就不会出现此类问题了?

Source: https://habr.com/ru/post/zh-CN437520/


All Articles