小编Kip*_*pie的帖子

如何防止箭头反模式

我对如何最好地将我的代码重构为更具可读性的东西感到困惑.

考虑一下这段代码:

var foo = getfoo();
if(foo!=null)
{
    var bar = getbar(foo);
    if(bar!=null)
    {
        var moo = getmoo(bar);
        if(moo!=null)
        {
            var cow = getcow(moo);
            ...
        }
    }
}
return;
Run Code Online (Sandbox Code Playgroud)

如您所见,需要大量嵌套if块,因为每个嵌套块依赖于先前的值.

现在我想知道如何让我的代码在这方面更清洁一些.

我自己想到的一些选择是:

  • 在每个if子句后返回,这意味着我有多个地方可以保留我的方法
  • 抛出ArgumentNullExceptions,之后我将它们捕获到最后并将return语句放在我的finally子句中(或者在try/catch块之外)
  • 使用标签和 goto:

大多数这些选项对我来说似乎有点"脏",所以我想知道是否有一种很好的方法来清理我创建的这个混乱.

c# design-patterns anti-patterns

51
推荐指数
7
解决办法
5093
查看次数

最佳实践:类或数据属性作为标识符

最近我一直想知道最好的方法是在多个元素上执行javascript操作.

我看到的方式有两种可能性:

  • 要么我向我的元素添加一个css类,它不一定对应于任何现有的css规则: <div class="validation-required"></div>
  • 或者我使用像这样的数据属性: <div data-validation-required></div>

在我的IDE(使用R#的Visual Studio 2012)中,如果我使用第一种方法,我会收到警告,说我不应该使用未定义的css类.这让我相信这可能不是最好的主意.然而,这是我最经常使用的方法,尽管这可能只是我们可以使用数据属性前几天的遗物.

所以我的问题非常简单,我应该采用哪种方式简单地"标记"元素以进行进一步处理?

谢谢你的回答

PS:我意识到这个问题可能容易产生主观意见,但我希望在现代浏览器中使用什么有共识.

PPS:我已经对这个问题进行了搜索,但大多数问题都与性能有关,这不是我对一次性情况的首要关注.

javascript html5

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

MVC视图中的多个表单:ModelState应用于所有表单

在单个视图上遇到多个表单的问题.

假设我有以下viewmodel:

public class ChangeBankAccountViewModel  
{  
     public IEnumerable<BankInfo> BankInfos { get; set; }  
}

public class BankInfo  
{  
    [Required]  
    public string BankAccount { get; set; }  
    public long Id { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

在我的viewmodel中,我希望所有BankInfos都显示在彼此之下,每个都在单独的表单中.

为实现这一点,我正在使用局部视图_EditBankInfo:

@model BankInfo

@using (Html.BeginForm())
{
   @Html.HiddenFor(m => m.InvoiceStructureId)
   @Html.TextBoxFor(m => m.IBANAccount)

   <button type="submit">Update this stuff</button>
}
Run Code Online (Sandbox Code Playgroud)

以及我的实际观点BankInfo:

foreach(var info in Model.BankInfos)
{
    Html.RenderPartial("_EditBankInfo", info);
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我的2个动作方法:

[HttpGet]
public ActionResult BankInfo()
{
    return View(new ChangeBankAccountViewModel{BankInfos = new [] {new BankInfo...});
}
[HttpPost]
public ActionResult BankInfo(BankInfo …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc modelstate

12
推荐指数
1
解决办法
5447
查看次数

Google可视化堆积区域图表:向工具提示添加总计

我正在使用谷歌可视化API来创建堆积区域图表.当用户将鼠标悬停在图表内的某个点上时,我希望它显示该位置点的总加总和,以及这些点的值.

第二点,我可以通过指定选项轻松实现focusTarget: 'category'.我希望在类似的外观中,在工具提示中有一个额外的行total.

我尝试通过添加一个额外的列来实现这个目的,该列Total的值为0,但工具提示等于总和.然而,这会为图例和图表本身添加一个空行,这在视觉上并不吸引人.

这对我来说应该是开箱即用的东西,但我找不到任何解决这个问题的方法.

如果有人知道解决这个问题的好方法,请回答.提前致谢.

javascript charts google-visualization

5
推荐指数
1
解决办法
1676
查看次数

Automapper映射具有继承性的基类

我在使用automapper映射我的父类时遇到了一些麻烦.鉴于以下类,我创建了一个映射配置文件.

映射类:

public class SourceClass
{
    public int SourceProperty1 { get; set; }
    public int SourceProperty2 { get; set; }
    public string SourceProperty3 { get; set; }
    public string SourceProperty4 { get; set; }
}

public class TargetBaseClass
{
    public int TargetProperty1 { get; set; }
    public int TargetProperty2 { get; set; }
}

public class TargetClass1: TargetBaseClass
{
    public string TargetProperty3 { get; set; }
}

public class TargetClass2: TargetBaseClass
{
    public string TargetProperty4 { get; set; }
} …
Run Code Online (Sandbox Code Playgroud)

c# automapper

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

排序类的向量

我有一个名为"UltrasoundTemplate"的课程.这些UltrasoundTemplate对象包含一个int参数,该参数显示何时定义它们(类似于时间戳).我有一个名为"UltrasoundTarget"的类,其中包含一个UltrasoundTemplate的矢量.我使用push_back(ultrasoundTemplate)将UltrasoundTemplates添加到矢量中.

现在我想按时间戳的顺序对矢量进行排序,而不是将它们添加到矢量中的顺序.

我在谷歌找到了很多答案,这些答案都向我展示了相同的解决方案,但显然我仍然做错了什么.以下是我认为找到解决方案所需的代码片段:

ultrasoundTemplate.h

class UltrasoundTemplate
{
public:
 UltrasoundTemplate(/*...*/);
 int getVolumePos() { return volume_; }
private:
 int volume_;
};
Run Code Online (Sandbox Code Playgroud)

ultrasoundTarget.h

//the sort algorithm
struct MyTemplateSort {
bool operator() ( UltrasoundTemplate t1, UltrasoundTemplate t2){
    int it1 = t1.getVolumePos();
    int it2 = t2.getVolumePos();

    if (it1 < it2)
        return true;
    return false;
}
};

class UltrasoundTarget
{
public:
 UltrasoundTarget(/*...*/);
 vector<UltrasoundTemplate> getTemplates() { return USTemplateVector_; }
private:
 vector<UltrasoundTemplate> USTemplateVector_;
};
Run Code Online (Sandbox Code Playgroud)

FMainWindow.cpp

void FMainWindow::match_slot()
{
 int i;
 //here I get the name of the target …
Run Code Online (Sandbox Code Playgroud)

c++ sorting class vector

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

条件数据属性的奇怪行为

我在ASP.Net MVC 4中遇到了一些奇怪的行为.

基于我的viewmodel中的一些信息,我试图设置一些条件属性,如下所示: <input type="checkbox" data-primary=@(Model.IsPrimary ? "true" : null) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />

这对于checkeddisabled属性工作得很好和花花公子,但由于某种原因它总是会渲染data-primary属性.Model.IsPrimary会导致正确data-primary="true",但!Model.IsPrimary导致空洞的data-primary归属.

这引出了我的第一个问题: 是什么导致了这种奇怪的行为?是因为我正在使用数据属性吗?它是数据属性中的破折号吗?

在那之后,我想,"好吧,确定,这很容易修复",并修复我的代码: <input type="checkbox" @(Model.IsPrimary ? "data-primary=\"true\"" : String.Empty) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />

这修复了我的data-primary属性显示,但不知何故,我的disabledchecked属性后来显示为空.

我现在的第二个问题是什么导致了这种行为?据我所知,我的代码中没有语法怪异.

如果有人有任何关于为什么剃刀这样做的信息,请回复.

PS:最后,我通过将我的data-primary属性放在input元素的末尾来"修复"事物,使一切都按预期运行.

razor asp.net-mvc-4

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

knockout.js:observableArray上没有concat

只能从knockout.js开始,但在尝试computed基于2个不同的observableArrays 创建方法时已经遇到了一些麻烦

使用knockout.js网站上的文档,我创建了以下viewmodel:

var Cart = function() {
  var self = this;

  self.Products = ko.observableArray([]);
  self.Products2 = ko.observableArray([]);
  self.Messages = ko.observableArray([]);

  self.TotalAmount = ko.computed(function() {
    var result = 0;
    ko.utils.arrayForEach(
      this.Products().concat(this.Products2()),
      function(item) {
        result+=item.AmountIncludingVAT();
      }
    );
    return result;
  });
};
Run Code Online (Sandbox Code Playgroud)

这样做会引发错误"Uncaught TypeError: Object #<error> has no method 'concat'.

我知道有这个函数叫arrayPushAll,但它是一个破坏性的功能,会改变原来的observableArray.(我不认为这是我想要的).

是否有任何干净的方法来实现我想要做的事情?或者我必须进行两次不同的呼叫arrayForEach,每个阵列一次?

javascript knockout.js

2
推荐指数
2
解决办法
8573
查看次数