小编Sed*_*glu的帖子

如何避免API设计中的"参数太多"问题?

我有这个API函数:

public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d, 
     string e, string f, out Guid code)
Run Code Online (Sandbox Code Playgroud)

我不喜欢它.因为参数顺序变得不必要的重要.添加新字段变得更加困难.很难看到传递的是什么.将方法重构为较小的部分更加困难,因为它会产生另一个传递子函数中所有参数的开销.代码更难阅读.

我提出了一个最明显的想法:让一个对象封装数据并传递它,而不是逐个传递每个参数.这是我想出的:

public class DoSomeActionParameters
{
    public string A;
    public string B;
    public DateTime C;
    public OtherEnum D;
    public string E;
    public string F;        
}
Run Code Online (Sandbox Code Playgroud)

这减少了我的API声明:

public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)
Run Code Online (Sandbox Code Playgroud)

尼斯.看起来很无辜,但我们实际上引入了一个巨大的变化:我们引入了可变性.因为我们以前一直在做的事实上是传递一个匿名的不可变对象:堆栈上的函数参数.现在我们创建了一个非常可变的新类.我们创建了操纵调用者状态的能力.太糟糕了.现在我希望我的对象不可变,我该怎么办?

public class DoSomeActionParameters
{
    public string A { get; private set; }
    public string B { get; private set; }
    public DateTime C { get; private …
Run Code Online (Sandbox Code Playgroud)

c# immutability data-structures

157
推荐指数
7
解决办法
3万
查看次数

空接口代码有异味吗?

我有一个函数返回相同类型的对象(查询结果),但没有共同的属性或方法.为了有一个共同的类型,我使用空接口作为返回类型,并在两者上"实现".

这听起来不对.我只能通过坚持希望有一天这些类会有一些共同点来安慰自己,我会将这个共同的逻辑移到我的空接口上.然而,我并不满足于思考我是否应该采用两种不同的方法并有条件地呼叫下一步.这会是一个更好的方法吗?

我还被告知.NET Framework使用空接口进行标记.

我的问题是:空接口是设计问题的强烈标志还是被广泛使用?

编辑:对于那些感兴趣的人,我后来发现功能语言中的歧视联盟是我试图实现的完美解决方案.C#对这个概念似乎并不友好.

编辑:我写了一篇关于这个问题的文章,详细解释了问题和解决方案.

c# design-patterns

76
推荐指数
4
解决办法
2万
查看次数

如何使用MemoryCache处理昂贵的构建操作?

在ASP.NET MVC项目中,我们有几个数据实例需要大量资源和时间来构建.我们想要缓存它们.

MemoryCache提供一定程度的线程安全性但不足以避免并行运行多个构建代码实例.这是一个例子:

var data = cache["key"];
if(data == null)
{
  data = buildDataUsingGoodAmountOfResources();
  cache["key"] = data;
}
Run Code Online (Sandbox Code Playgroud)

正如您在繁忙的网站上看到的那样,数百个线程可以同时进入if语句,直到构建数据并使构建操作更慢,不必要地消耗服务器资源.

AddOrGetExisting在MemoryCache中有一个原子实现,但它错误地需要"值来设置"而不是"代码来检索要设置的值",我认为这使得给定的方法几乎完全没用.

我们一直在MemoryCache周围使用我们自己的ad-hoc脚手架来实现它,但它需要明确的locks.使用每个条目的锁定对象很麻烦,我们通常会通过共享远离理想的锁定对象来逃避.这让我觉得避免这种惯例的理由可能是故意的.

所以我有两个问题:

  • lock建立代码是一种更好的做法吗?(对于一个人来说,这可能已被证明更具响应性,我想知道)

  • 对于这样的锁,实现MemoryCache的每个条目锁定的正确方法是什么?使用key字符串作为锁定对象的强烈冲动在".NET锁定101"中被忽略.

.net c# memorycache

58
推荐指数
2
解决办法
1万
查看次数

如何模拟单击锚标记?

我想模拟点击一个锚标记,其中包含正确的目标处理等所有额外内容.

对于锚点的DOM对象似乎有一个"[click()] [3]"方法,但并非所有浏览器都支持它.Firefox抛出此错误:

错误:anchorObj.click不是函数

它在Opera 10和Konqueror上也很奇怪,当它在周围div的onclick处理程序中调用时会导致无限点击.我想只有IE8可以正常使用它.无论如何我不想要它,因为主流浏览器大多数都有问题.

我在Mozilla论坛中找到了Firefox的替代解决方案:

var evt = document.createEvent("MouseEvents"); 
evt.initMouseEvent("click", true, true, window, 
    0, 0, 0, 0, 0, false, false, false, false, 0, null); 
anchorObj.dispatchEvent(evt); 
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎太丑陋了.我不知道它是多么兼容,我想尽可能避免编写特定于浏览器的代码.

我不能使用location.href = anchorObj.href; 因为它不处理"目标"属性.我可以根据目标值进行一些硬编码,但我也想避免这种情况.

有建议切换到JQuery,但我不确定它处理目标属性有多好,因为我之前没有使用它.

html javascript dom

45
推荐指数
4
解决办法
9万
查看次数

NUnit全局初始化 - 坏主意?

我们的测试套件中需要一些全局一次性设置代码.我们可以做多次,但需要相当长的时间.

  • 这是所有灯具所要求的,所以[TestFixtureSetUp]不起作用.它必须在所有[TestFixtureSetUp]代码之前运行.

  • 放入它,Main()因为我们将测试程序集保存为可执行文件.但是Main不会在GUI客户端下执行.

  • 使用静态构造函数创建一个单独的类进行初始化只有在引用我们不喜欢在每个类中执行的类时才有效.

  • 继承基类中的所有测试装置并向其添加静态构造函数会导致对init代码的多次调用.

鉴于这种情况,我有两个问题:

1)"全局设置"是否非常糟糕,NUnit不支持它?

2)实现这一目标的最不痛苦,最常见的方法是什么?

.net nunit unit-testing

38
推荐指数
3
解决办法
1万
查看次数

抛出未处理的枚举值的正确异常是什么?

这是我关于未处理的枚举案件的另一个问题的另一个案例,我建议将其作为一个单独的问题提出.

假设我们有SomeEnum一个switch语句处理它,如:

enum SomeEnum
{
  One,
  Two
}

void someFunc()
{
  SomeEnum value = someOtherFunc();
  switch(value)
  {
     case One:
       ... break;
     case Two:
       ... break;
     default:
         throw new ??????Exception("Unhandled value: " + value.ToString());    
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我们处理所有可能的枚举值但仍保留默认值,以防添加新成员,并且我们希望确保我们知道缺少的处理.

我的问题是:在你想要通知给定的代码路径没有被处理/实现或者从未被访问过的情况下,什么是正确的异常?我们曾经使用NotImplementedException但它似乎不合适.我们的下一个候选人是,InvalidOperationException但这个词听起来不对.什么是正确的,为什么?

.net c# exception

33
推荐指数
5
解决办法
2万
查看次数

如何在ASP.NET MVC中更改默认验证错误消息?

说我的模型中有这个属性:

[DisplayName("test")]
[Required(ErrorMessage = "required")]
public DateTime? SomeDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

当您输入"asdf"时Html.TextBoxFor(model => model.SomeDate),您会收到验证错误消息"值'asdf'对测试无效.".

你如何修改那条消息?ASP.NET MVC被忽略了[DataType(DataType.DateTime, ErrorMessage = 'some other message')]

asp.net-mvc data-annotations asp.net-mvc-2

28
推荐指数
1
解决办法
6万
查看次数

无法将null分配给array类型的匿名属性

我有任何Pilot带有(Hanger)属性的()对象数组,该属性可以为null,它本身具有(List<Plane>)属性.出于测试目的,我想简化并将其"展平"为具有属性PilotName(字符串)和Planes(数组)的匿名对象,但不确定如何处理null Hanger属性或空PlanesList.

(为什么是匿名对象?因为我正在测试的API的对象是只读的,我希望测试是'声明性的':自包含,简单和可读......但我对其他建议持开放态度.我也是我想了解更多有关LINQ的信息.)

class Pilot
{
    public string Name;
    public Hanger Hanger;
}

class Hanger
{
    public string Name;
    public List<Plane> PlaneList;
}

class Plane
{
    public string Name;
}

[TestFixture]
class General
{
    [Test]
    public void Test()
    {
        var pilots = new Pilot[]
        {
            new Pilot() { Name = "Higgins" },
            new Pilot()
            {
                Name = "Jones", Hanger = new Hanger()
                {
                    Name = "Area …
Run Code Online (Sandbox Code Playgroud)

c# linq anonymous-types

26
推荐指数
3
解决办法
2万
查看次数

是否有一个替代Dictionary/SortedList允许重复?

可能重复:
C#可排序集合,允许重复键

基本上我想使用重复键使Dictionary工作,而无需进入自定义比较器实现.有一个想法:

  Dictionary<key, List<value>>
Run Code Online (Sandbox Code Playgroud)

但它仍然有一些开销.我希望词典有"AllowDuplicates".

.net dictionary priority-queue multimap

20
推荐指数
2
解决办法
3万
查看次数

WCAG 2.0验证的任何工具建议?

我相信现在每个人都在努力使WCAG 2.0符合网页.您是否可以分享任何与您遇到的相同的好工具?

以下是我遇到的一些好工具 -

1. http://www.powermapper.com/products/sortsite/index.htm

好处:

1. It does WCAG 2.0, WCAG 1.0, browser compatibility and many other checks
2. Low cost
Run Code Online (Sandbox Code Playgroud)

坏处:

1. it seems it doesn't have command line API.(as per my initial evaluation)
2. Web mode doesn't support HTML upload
Run Code Online (Sandbox Code Playgroud)

2. http://achecker.ca/checker/index.php

好处:

  1. 自由!!!
  2. 支持WCAG 2.0
  3. 有Web服务API

缺点:

  1. Web服务API不支持HTML文件上载.它期望HTML文件部署在Web上的某个位置

w3c accessibility wcag

18
推荐指数
1
解决办法
1万
查看次数