代码之家  ›  专栏  ›  技术社区  ›  WeNeedAnswers

扩展对象(动态)我最伟大的朋友还是我新的最大敌人?

c#
  •  2
  • WeNeedAnswers  · 技术社区  · 15 年前

    是的,我知道它不应该被滥用,而且C主要用作静态语言。但是说真的,伙计们,如果你能用Python的方式弄脏一些代码,或者创建一些动态的DoHicky,你会吗?

    我花了一段时间爱着巨蟒的动态,我的大脑在加班加点地工作,C是从后门进入黑暗面吗?

    静态类型的参数是不是有了这个明显的附加值就死了?

    当我们都是成年人的时候,少单元测试的论点有点愚蠢吗?

    或者,动态的添加是否破坏了一种强静态类型和设计良好的语言?

    7 回复  |  直到 15 年前
        1
  •  6
  •   gradbot    15 年前

    当我开始使用类型推断时,我失去了使用动态类型的愿望。

        2
  •  6
  •   Andrew Hare    15 年前

    C已经扩展到包括动态类型的某些方面,是的,但这并不意味着静态类型已经死了。这仅仅意味着C已经添加了一些工具,允许各种说服的开发人员以多种不同的方式解决各种问题。

    我对一种类型的系统比另一种更好的概念有一个问题。这就像是说锤子比螺丝刀好。如果不知道手头任务的背景,就不可能做出这样的决定!动态类型优于静态类型 对于某些问题和情况 反之亦然。这种方法的优越性完全取决于手头的问题。

    因此,为了坚持我的工具类比,最好有一个工具箱,其中包含锤子和螺丝刀,并知道如何有效地使用每一个。这将使您成为一个更好的开发人员,因为您将最有能力解决您面临的任何问题。C的新的动态类型添加只是为了帮助您在一个简单、方便的包中提供这些工具。

        3
  •  2
  •   Community CDub    8 年前

    是静态类型a的参数 有这个明显的附加物吗?

    是更少单元测试的参数 我们都长大了,有点傻吗?

    或者是动力的添加被破坏了 强静态类型 设计语言?

    有一段时间,语言已经越来越多地进入“可能的话静态类型化,必要时动态类型化”的领域。与 structural typing (静态检查duck类型)开始进入主流语言,我们可能会看到语言发展到基本上静态检查python的程度。

    为了它的价值, dynamically typed code is just as mindful of types as statically typed code . 惯用的C仍然是静态类型的,并且在未来很长一段时间内保持这种状态。

        4
  •  1
  •   Jeremy Bell    15 年前

    据我所知,动态关键字的引入更多地是为了便于在运行时对未知类型进行互操作和方法调用,而不是像Python这样的语言中的动态类型。

    本质上,如果您以前必须调用InvokeMember才能对未知类型调用方法,那么您将创建一个动态对象,并只调用该方法,该方法将在运行时解析。代码变得非常容易阅读。为什么要对未知类型调用方法(或访问属性)?当你使用数据绑定的时候,wpf会一直这样做。

    如果希望使用弱绑定(例如,如果希望编写使用Office Interop的代码,但希望支持多个版本的Office),则也可以使用它。我以前必须这样做,它的代码是可怕的。动态关键字将使此类代码更易于阅读和理解。

    有关详细信息,请参阅本文:

    http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx

        5
  •  1
  •   ssp    15 年前

    据我所知,类型错误大约占所有发现错误的5-10%,因此对于静态类型为免费的语言,我们的错误更少。对于静态类型,单元测试和回归测试也要小一些。

    动态类型对于OO语言来说很好。对于FP语言(尤其是HM类型系统),动态类型和静态类型不会影响程序设计的总体决策。

    但是,有时您需要良好的代码性能,而这一时刻将向您展示动态类型的阴暗面。

        6
  •  0
  •   Indeed is Trash    15 年前

    对。
    不。
    不。
    对。
    不。

        7
  •  0
  •   Gabe Timothy Khouri    15 年前

    对于大型项目来说,强类型仍然是最好的方法。它不仅使代码完成(intellisense)变得更好,而且可以在编译时告诉您明显的问题。例如,假设 socket.Write 取一个字符串。在C中,如果你试图传递一个数字,你将无法运行你的程序,而在python中,你只会在程序崩溃时发现你的bug。

    另一方面,很容易想象有一个JSON解析器像一个expando对象一样自动增长JSON中指定的属性会有多有用。

    为了详细阐述我的观点,我认为C在获得其好处的同时,基本上可以避免动态输入的坏处。这是因为系统仍然鼓励在所有内容上使用类型,而不是其他动态语言,其中类型完全是可选的(甚至只是建议性的)。在C中,您可以只使用duck类型、expando属性和其他动态类型的优点“git'er done”,但它将用 dynamic 关键字,帮助您保持它的独立性。