使用静态或非静态类

时间:2015-12-10 09:04:15

标签: c# design-patterns

我得到了一个静态的课程,但这是一个不好的选择吗?它应该是非静态类吗?

我想在班上设置两个值。

当您设置属性值时,是否有可能在设置属性值时和获取属性时会出现某种冲突?如果其他用户具有相同的目标。

我有一个叫这个班级的页面。 一个用户点击该页面就会发生这种情况。

  1. 设置计算属性
  2. 运行void以计算两个属性
  3. “也许其他一些功能运行并需要一些时间”
  4. 获取两个属性的值
  5. 但是,如果另一个用户点击该页面并设置其他值并使第一个用户的值不正确,该怎么办?我想这可能吗?

    我想到的其他一些选择是

    • 将所有属性作为参数发送到void中,并返回一个包含我需要的两个值的新类。 (不要将它们存储为静态属性,在使用之前可以由其他用户更改)。
    • 使用属性(可能称为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;
        }
    }
    

1 个答案:

答案 0 :(得分: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);
    }
}