从其他语言模仿概念会产生什么问题?


12

我在网络上已经读过很多遍了,如果您的语言不支持某些概念(例如,面向对象或函数调用),并且在其他情况下被认为是一种好的做法,则应该这样做。

我现在看到的唯一问题是,其他程序员可能会发现您的代码与通常的代码太不同,从而使他们难以编程。您认为这还会引起什么其他问题?


3
人们会取笑你,因为一件事:-)
Karl Bielefeldt 2012年

我翻译了d嵌套函数解析成Java一次,但我承认这不是我写过最干净的代码(与接口和几个班的一个大功能,实现它里面定义)
棘轮怪胎

Answers:


23

问题之一是,您可能会发现自己编写了很多代码来表达您将要用另一种语言进行表达的方式,而您所使用的语言中存在一种更为直接的方式。

例如,在有关Stack Overflow的答案中,我解释了如何在不支持它们的PHP中部分模拟代码契约(.NET Framework中使用的概念)。我最终花了很多钱才写了代码,因为同样的事情对于简单的数组是可行的。

一般来说,每种语言都有自己的文化,最佳实践和风格。

  • 如果我像C一样开始编写C#代码,那将是丑陋的。

  • 如果我将Haskell理解为被迫使用Haskell的Java开发人员,但又不想了解其优势而只想克隆Java的概念,那么我编写的代码将会受到影响。

  • 等等

尝试增强语言没有错(例如,通过像F#中那样引入度量单位来增强C#),但是如果您做得太多,则可能应该选择一种真正适合您需要的语言。


+1好的答案,也感谢您向C#中添加了度量单位(如F#)的其他搜索词。

2
作为曾经因为被迫使用Java而辞职的人,我只有2美分:一个人不能被迫使用Haskell,一个人爱上了它,然后它使您陷入无法自拔的境地。Haskell就像一个可爱的黑洞,您只想掉进去-与真实的黑洞不同,您仍然活着讲这个故事:)
Cetin Sert 2012年

您可能应该选择另一种语言 ……除非您别无选择,例如客户端JavaScript。(即使如此,别无选择也不是在原型语言中实现基于类的OOP仿真的借口。仅学习该语言的工作效率会更高。)
kojiro 2012年

@kojiro:或其他工作。当我被迫使用PHP时,我自己遇到了同样的问题,并且我一直在试图修改语言,包括编写自己的编译器。较不疯狂的解决方案是更换工作,仅在不使用PHP的项目上开始工作。
阿森尼·穆尔琴科(Arseni Mourzenko)2012年

1
@Cetin Sert:同意,Haskell是一门出色的语言。但是,如果有人不想学习它并且不理解函数式编程,那么很难理解Haskell。
阿森尼·穆尔琴科(Arseni Mourzenko)2012年

10

降低可读性本身就足以解决问题:它极大地减少了无需您进行大量培训就可以维护您的项目的人员库。

此外,

  • 实施外国范例可能比使用它可能节省的成本更多
  • 您对外部功能的调整可能有问题,从而增加了维护成本
  • 您对外部功能的适应可能会将您的技术堆栈推到超出本机实现要求的极限。

2
我曾经不得不在普通C语言中模拟C ++动态调度(虚拟表等),并且碰到了这个问题:不了解动态调度的C程序员无法为项目做贡献或维护。
即将来临的风暴2012年

4

这不像在纸上出现的那样好。

示例1:如果您足够大,您可能还记得C是小镇上的新孩子的日子。Pascal和Ada程序员不喜欢C简洁的大括号。他们#defined beginend打开大括号和大括号,瞧!卡达!从Ada或C的角度来看,不幸的结果是丑陋的。

例2,个人:我对Common Lisp对象系统的真正爱好之一是它在方法之前,之后和周围。它们可以在多个地方派上用场。因此,我在一些特定的地方用C ++模仿了这个概念。在C ++中模拟这些构造的唯一方法是要求派生类的开发人员在代码的正确位置调用同名的父类的方法。这对从我的类派生的开发人员提出了要求,这对C ++编程有点陌生,也许与C ++编程的本质背道而驰。不管该要求的文档化程度如何,人们都不会遵循该准则,因为它不完全符合C ++范例。


2

从其他语言模仿概念会产生什么问题?

泄漏的抽象。


最好在答案中包含更多详细信息。本文涉及一种情况,其中抽象未能捕获重大的性能优化,但是我想说,更大的问题是由于不一致的极端情况下的行为和不一致的保证引起的。后者的一个例子是C#试图out在一个并不真正支持参数的框架中模拟参数。C#假定每个函数将始终写入其所有out参数,但是C#方法调用的非C#方法不提供此类保证。
supercat 2014年

1

这可能非常困难。想象一下试图将LINQ从C#实现到Java应用程序中。还是仅向语言添加词汇闭包?您几乎必须编写一个新的编译器,这几乎为您提供了一种新的语言。

或者,对于不必使用自己的语言的情况,仅想象一下尝试使用不具有代码块或lambda函数或闭包或函数作为第一语言的高阶函数(例如map)来实现集合方法类对象。必须将每个更高阶的函数声明为接口并显式实现,并且必须将在闭包中捕获的所有状态显式存储在实现类中。它太多了,而且很难阅读,所以通常不值得。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.