我有一个ASP.NET项目,其中我有一个包含10个局部变量的方法。此方法调用大约10个其他方法。 3个被调用的方法需要所有变量。将所有这些变量转换为全局成员是否被视为良好做法,然后它们不必作为参数传递?
答案 0 :(得分:8)
如果要传递复杂状态,请将其打包在对象中 - 即
public class Foo {
public string Key {get;set;}
public decimal Quantity {get;set;}
// etc
}
让方法接受这个对象作为参数。然后你只需创建一个这样的实例并传递它。
全球是一个很大的禁忌; ASP.NET是高度线程化的 - 这将是一场噩梦。每个请求状态是可能的,但有点混乱。
答案 1 :(得分:4)
这些变量是相互关联的,要么全部相关,要么可能分成几组?如果是这样,将它们封装成一个类型。因此,您可能有一半的变量与用户有关,一半与请求的操作有关 - 突然您的方法只需要10个变量。
让事情变得全球化几乎总是错误的方式。
答案 2 :(得分:3)
改为创建一个结构并传递结构而不是传递这10个参数
例如:
public struct user
{
public string FirstName;
public string LastName;
public string zilionotherproperties;
public bool SearchByLastNameOnly;
public datetime date1;
}
答案 3 :(得分:2)
嗯,这完全取决于“全球成员”的意思。
如果考虑到您正在编写ASP.NET应用程序,那么您的意思是基于会话/应用程序的缓存值,那么它取决于。这会影响性能,因此您应该测量一下它是否会对您的应用产生任何影响。
如果你的意思是静态变量,那么没有。静态是每个应用程序,因此将适用于您的Web应用程序的所有用户,而不仅仅是一个人。线程静态也不是一个好主意,因为单个用户可能会在应用程序的生命周期中在线程之间浮动。
答案 4 :(得分:2)
如果你有真正对大量变量采取行动的方法,比如你提到的,你也可以考虑设计一个目的是充当数据容器的类。填充后,您可以将类传递给需要数据而不是十个参数的函数。
我不记得确切的示例,但在Microsoft的“框架设计指南”一书中,他们明确地描述了一个类似于您的场景以及它们如何在.NET Framework中遵循相同的方法。
此外,如果您需要传递那么多参数,请退后一步,确保相关代码不需要重构。在合法的情况下,方法需要大量数据,但我使用长方法签名作为一个标志,我需要查看方法内部以确保它只执行它所需要的内容。
答案 5 :(得分:1)
请务必注意拳击。如果您传递10种参考类型,则归结为个人偏好。
但是,如果要传递10种值类型,如果要将它们声明为类中的成员变量,则它们将被装箱,然后它们必须由收件人取消装箱。
如果将它们局限为方法堆栈中的局部变量(作为参数传递),它们将纯粹保留在堆栈上,而不是被装箱到堆中。
答案 6 :(得分:1)
对于纯粹的机械重构,将值组合在一起(如建议的那样)可能是最好的解决方案。
但是,您有一系列依赖方法,每个方法都处于共同状态(至少10个值)。听起来你应该设计一个类来处理这个操作。
该类将封装行为和相关状态,而不是简单的属性包(请参阅Anemic Domain Model)。