静态方法和类是否有利于可伸缩性?我认为静态类/方法可以提高应用程序的可伸缩性,而实例方法不会扩展太多。那么在可能的情况下编写静态方法是不是很好的编程习惯呢?
答案 0 :(得分:11)
静态方法和类是否良好 可伸缩性?
一个与另一个没什么关系。
我认为是静态类/方法 提高应用程序的可伸缩性 和实例方法不会扩展 得多。
错误。你为什么这么认为?
这是一个很好的编程实践 写静态方法 可能的?
没有。事实上,这是非常糟糕的做法,因为它放弃了面向对象编程的可维护性优势。
答案 1 :(得分:4)
静态方法需要考虑三个问题:
它通常不被认为是最佳实践,但静态辅助方法很常见。太复杂了,应该考虑另一种方法。
答案 2 :(得分:3)
没有静态方法本质上不会更好地扩展。事实上,编程风格(命令式或面向对象)对于任何缩放都没有任何影响。缩放有两个主要方面,如何改进规模取决于我们的意思:
1按秒处理的请求数量缩放
此类扩展通常是将更多计算机添加到群集中以提高系统的整体吞吐量。增加扩展通常是最初减少通过使用缓存所使用的共享资源的数量,然后将数据访问分成碎片。
2数据缩放
这是系统随着时间的推移获得越来越多的数据,并且访问数据的操作(搜索,过滤等)变慢,因为算法比O(1)更复杂。在这种情况下,通常的策略是增加读取和写入点的数量,并使用并行算法,如Map / Reduce。
但这些方面都与您是否使用静态方法无关,只是多个请求是否适用于大型数据集或单个数据源。
答案 3 :(得分:3)
这取决于 WHY 方法是静态的。如果它是静态的,因为它确实不需要上下文,那么与相似的复杂性相比,它可能会非常好地扩展,因为它需要上下文。
但是,如果它只是因为你不能保留所需的上下文并且仍然必须传递它,或者由于某些人为的目标有更多的静态方法而是静态的,那么我会怀疑它实际上会比同等方法缩放LESS作为非静态的。
事实上,我认为ASP Classic证明了这一点。
答案 4 :(得分:2)
没有。我想你可能假设每个实例都有自己的方法定义副本,占用每个实例的空间量,但事实并非如此。
编辑添加:
如果您想知道如何在实例之间实际共享实例方法:这是因为对实例方法隐含的每次调用都会将对实例对象的引用传递给方法。这通常被称为“隐式this”换句话说 - 当您使用两个参数(如myMethod(a,b))定义或调用实例方法时,您可以将其视为实际上是myMethod(this,a,b) ,并且Java会为您处理此参数,而无需您明确定义或传递它。
(顺便说一下,这在Python中的处理方式不同,你必须明确地将对象引用作为实例方法定义的第一个参数,但不在调用中。)
有关Java字节码级别的内容的解释,这里有一个链接: http://www.artima.com/underthehood/invocationP.html (参见周围的事情:“objectref是传递给任何实例方法的隐式this指针。”)
答案 5 :(得分:1)
您的意思是哪种形式的可扩展性?可伸缩性,代码在大型和小型项目中是可维护和可扩展的吗?然后只使用静态方法伤害。你的意思是表现吗?如果实例方法较慢(我不相信这种一般性),那么这并不意味着它们不会扩展。如果他们需要两倍的时间作为静态方法,如果你将它们全部调用10000次,他们还需要两倍的时间。选择正确的算法和数据表示可以更好地决定性能的可扩展性。
最后,如果您认为静态方法是可行的方法,则不应使用像Java这样的面向对象语言。尝试C或Pascal或经典的基本方言。
答案 6 :(得分:1)
我认为你正在咆哮错误的树:
在现实世界中,可伸缩性(或缺乏可伸缩性)通常源于一个算法的适当性和针对数据存储的操作效率(想想:良好的SQL查询)。
方法是否是静态的(或者静态方法的百分比)通常与系统的可伸缩性无关。你当然可以拥有一个不使用静态方法的超级可扩展系统,或者只使用它们的超级可扩展系统。
答案 7 :(得分:0)
投票。 OP显然不太了解OO。创建实例对象时,实例方法不会占用任何额外空间。除非你还避免创建任何实例,否则静态方法不会为你节省任何东西,在这种情况下,你将远离OO语言的构建,因为这是一种毫无意义的讨论。