C# 如何简化代码?

C# 如何简化代码?,c#,silverlight,C#,Silverlight,我刚刚用C#/Silverlight创建了我的第一个主要应用程序。最后,代码行总数超过12000行。考虑到这是对一个php/javascript应用程序的重写,我花了2年时间创建了一个超过28000行的应用程序,我为自己的成就感到非常自豪 在阅读了stackoverflow和其他在线网站上的许多问题和答案后,我遵循了许多海报上的建议:我为一年前复制和粘贴的东西创建了课程、程序等;我创建了逻辑图来计算复杂的函数;确保没有疯狂的隐藏字符(使用制表符而不是空格);还有其他一些事情;必要时发表评论(我有

我刚刚用C#/Silverlight创建了我的第一个主要应用程序。最后,代码行总数超过12000行。考虑到这是对一个php/javascript应用程序的重写,我花了2年时间创建了一个超过28000行的应用程序,我为自己的成就感到非常自豪

在阅读了stackoverflow和其他在线网站上的许多问题和答案后,我遵循了许多海报上的建议:我为一年前复制和粘贴的东西创建了课程、程序等;我创建了逻辑图来计算复杂的函数;确保没有疯狂的隐藏字符(使用制表符而不是空格);还有其他一些事情;必要时发表评论(我有很多评论)

我的应用程序由4个水平排列的平铺组成,每个平铺中都加载了用户控件。您可以随时加载一到四个切片。如果你加载了一次切片,切片就占据了整个艺术板……如果加载了两个,每个都占一半,三分之三,四分之一

这些切片中的每一个都代表一个灯光控件(在本例中)。每个切片中有3个滑块控件。现在,当我对滑块的功能进行编码时,我在公共函数中使用了switch/case语句,该语句将在指定的slice/slider上运行命令。这导致了一些重复的代码,但我看不到解决方法,因为每个片段的命名都不同。因此,我将执行切片1.my.commands();切片2.my.commands();等等


我想问你的问题是,如何进一步清理我的代码?(遗憾的是,我无法发布我的任何代码)。有什么方法可以消除我的代码中的重复吗?

既然你真的不能发布任何代码,我还是随便说说吧。你能把这些切片放到一个数组里吗?如果是这样,您可以通过让每个控件设置一个变量(我称之为
whichSlice
)来消除一些冗余代码。因此,所有控件都将
whichSlice
设置为正确的数字1-4,然后运行一个普通开关并调用
slices[whichSlice].my.commands()

写更少的代码不应该是你的目标。归根结底,这一切都与TCO(总体拥有成本)有关

虽然拥有更少的代码可以提高总体拥有成本,但有一个因素对总体拥有成本有更大的影响:可维护性。您应该编写最易于维护的代码。从阅读开始

更新:

你还说“我有很多评论”。这是您可以改进代码的地方。正如您将从Martin的书中了解到的,好的代码几乎不需要任何注释。Martin说“评论都是谎言”,“应该保留给关于代码和设计的技术注释。”

更新2:

当我添加它时,以下是我最喜欢的引用自罗伯特·马丁的书:

  • “一个类或模块应该有一个且只有一个更改[单一责任原则]的理由。”[第138页]
  • “三个以上的[method arguments]是非常值得怀疑的,应该避免产生偏见。”[第288页]
  • “函数的第一条规则是它们应该小。函数的第二条规则是它们应该比这个小。”[第34页]
  • “函数不应该有20行长”[第34页]
  • “函数中的语句都应该在同一抽象级别上编写”[第304页]
  • “有关规范和设计的技术说明应保留意见。”[第286页]

您需要的是与您的朋友建立一个战略模式接口。例如:

public interface ISlice 
{
    public Slider Slide {get;set;}
}

public class Slice1 : ISlice 
{
    public Slider Slide { get; set; }
}

public static class SliceSlider
{
    public static void DoSomethingCoolWithTheSliceSlide(ISlice slice) 
    {
        slice.Slide.LookitMeIAmLearningDesignPatterns();
    }
} 

我倾向于同意史蒂文的观点。编写更少的代码或更少的行并不总是目标。回想史蒂夫·沃兹尼亚克(Steve Wozniak)的一些故事,他曾经制造非常紧凑的硬件,将大量的逻辑放入一个非常小的包中,但很少有人能够遵循他的做法,维护或制造它

话虽如此,我建议您熟悉设计模式。它们可能不会减少代码行数,但会使代码更易于编写、维护和理解。很多时候,他们确实减少了你的线路数量。以下是一些资源:


接口和抽象类是.net平台非常强大的一部分

接口只不过是类的契约要求。也就是说:接口是实现该接口的类必须具有的一组已定义的方法和/或属性。接口只是一个契约声明

抽象类非常强大,因为您可以将逻辑“带入”实现该抽象类的类中。但那完全是另一回事

考虑:

public interface ISlice
{
    bool DoStuff(string someParameter);
}

public class MySpecificSliceOfType : ISlice
{
    // this must have a method implementation for the [bool DoStuff(string)] method
    public bool DoStuff(string mySpecificParameter)
    {
       // LOGIC in the Specific class
       return(true);
    }
}

public class MyOtherSliceOfType : ISlice
{
    // this must have a method implementation for the [bool DoStuff(string)] method
    public bool DoStuff(string myOtherParameter)
    {
       // LOGIC in the Other class
       return(true);
    }
}
虽然这是一个过于简单的示例,但在类“MySpecificSliceOfType”和“MyOtherSliceOfType”上声明ISlice接口的接口实现意味着所需的DoStuff()方法与您拥有的方法无关,因为您可以执行以下操作:

bool sliceReturn = ((ISlice)currentSlice).DoStuff(currentStringParameterValue);
bool sliceReturn = false;
switch(typeofSlice)
{
    case "other" :
        sliceReturn = MyOtherSliceOfType.DoStuff(currentStrignParamterValue);
        break;
    case "specific" :
        sliceReturn = MySpecificSliceOfType.DoStuff(currentStrignParamterValue);
        break;
}
这可以节省您在以下方面的工作:

bool sliceReturn = ((ISlice)currentSlice).DoStuff(currentStringParameterValue);
bool sliceReturn = false;
switch(typeofSlice)
{
    case "other" :
        sliceReturn = MyOtherSliceOfType.DoStuff(currentStrignParamterValue);
        break;
    case "specific" :
        sliceReturn = MySpecificSliceOfType.DoStuff(currentStrignParamterValue);
        break;
}
当您有>2种不同的类型时,此处说明的要点更为突出

接口和抽象类也与C#类型检查很好地结合在一起


接口是反射中的一个基本元素。。。一些可以非常节省使用的东西,但由于在特定情况下可以节省很多,所以使用起来不太方便。。。还有序列化(又称序列化),它能真正帮助你飞行。

+1。我很想看到答案,因为我自己在很多代码上都有这个问题。这是我的投票。听起来“切片”是应用程序范围内的,接口将是维护代码的最佳方式。史蒂文也有一个很好的观点,得到总线数不应该是你的目标;干净的、可维护的和可伸缩的代码应该是。祝你好运你有关于“界面”的很棒的教程/参考资料吗。这听起来很有趣。在我的脑海里,没有什么你能理解的