2015-12-10 148 views
3

我得到了一个我制作了静态的类,但这是一个糟糕的选择吗?它应该是一个非静态类吗?使用静态或非静态类

我想在我的班级中设置两个值。

当你给属性值设置它们并获取它们时会有某种冲突吗?有没有什么机会?如果另一个用户具有相同的目标。

我有一个页面调用这个类。 一位用户点击该页面,发生这种情况。

  1. 设置属性的计算
  2. 运行的空隙来计算两个属性
  3. “也许一些其他的功能,运行和需要一些时间”
  4. 获取两个属性的值

但是如果其他用户击中页面并设置其他值并使第一个用户的值不正确,该怎么办?我想这可能吗?

我想到了一些其他的选择是要么

  • 发送所有属性到空隙作为参数,并与我的两个值,我需要回到一个新的类。 (不要将它们存储为静态属性,在使用之前可以由其他用户更改)。
  • 使用属性(可能称为BreakTime)创建一个新类。将其作为一个参数发送给void。计算后返回。
  • 或者你告诉我什么是最好的选择! :)

这里怎么看起来:

public static class BreakTimeCalculator 
{ 
    public static int BreakFromSec { get; private set; } 
    public static int BreakUntilSec { get; private set; } 
    public static int CustomBreakSec { get; set; } 
    public static int FromSec { get; set; } 
    public static int UntilSec { get; set; } 
    public static int Equlizer { get; set; } 

    public static void CalculateBreakFromAndBreakeUntil() 
    { 
     var taskLength = UntilSec - FromSec; 
     var middleOfTask = FromSec + (taskLength/2); 
     var secondsToMoveLeft = middleOfTask % 300; 
     var amountEqualizers = CustomBreakSec/Equlizer; 
     var fiftyFifty = amountEqualizers % 2 == 0; 
     var leftSideEqualizers = fiftyFifty ? amountEqualizers/2 : (amountEqualizers/2) + 1; 

     BreakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * Equlizer); 
     BreakUntilSec = BreakFromSec + CustomBreakSec; 
    } 
} 
+0

简单地说,如果你需要使一个类是静态的,而不是如果可能的话。我怀疑这是否是这种情况。通常这应该很少发生(例如,在包含扩展方法的类上)。 – HimBromBeere

+1

@HimBromBeere,我会遵循这样的规则:“如果可以的话,让一个类变成静态的,如果你有状态,那么你就不能”。 –

+0

@DavidArno嗯,你可以为静态对象提供(单一)状态,但是它的设计很糟糕。然而,“当你可以”的时候,我认为它的语法正确。 – HimBromBeere

回答

6

从不创建静止状态,除非你真的,真的要因为如果你这样做,你会为自己设定了一个秋天。你让测试变得更加困难,并且使得线程冲突的可能性(如你所描述的)发生得更高。

如果您必须在类中设置状态,然后调用方法,而不是仅将值作为参数传递给方法,请将其设置为非静态类。另外,您最好通过构造函数传递值,而不是使用属性。如上所述,我对待您的问题的方法是创建一个POCO来保存结果数据并使用静态方法进行计算。使用C#6语法,它看起来像这样:

public class BreakTimeResult 
{ 
    public BreakTimeResult(int breakFromSec, int breakUntilSec) 
    { 
     BreakFromSec = breakFromSec; 
     BreakUntilSec = breakUntilSec; 
    } 

    public int BreakFromSec { get; } 
    public int BreakUntilSec { get; } 
} 


public static class BreakTimeCalculator 
{ 
    public static BreakTimeResult CalculateBreakFromAndBreakeUntil(int customBreakSec, 
                    int fromSec, 
                    int untilSec, 
                    int equlizer) 
    { 
     var taskLength = untilSec - fromSec; 
     var middleOfTask = fromSec + (taskLength/2); 
     var secondsToMoveLeft = middleOfTask % 300; 
     var amountEqualizers = customBreakSec/equlizer; 
     var fiftyFifty = amountEqualizers % 2 == 0; 
     var leftSideEqualizers = fiftyFifty 
      ? amountEqualizers/2 
      : (amountEqualizers/2) + 1; 

     var breakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * equlizer); 
     var breakUntilSec = breakFromSec + customBreakSec; 
     return new BreakTimeResult(breakFromSec, breakUntilSec); 
    } 
} 
+0

分离哪些变化与什么不...好点:-) – Philippe