小编Ben*_*ter的帖子

我该如何命名一种方法呢?

我有一个接收两个范围端点的方法 - 范围的开始和范围的结束以及整数.

它检查整数是否落在两个端点之间,如果整数落在边界之外,则返回整数或相应的结束点.

例1:

  • RangeStart = 0; RangeEnd = 10; 值= 5; 返回5

例2:

  • RangeStart = 0; RangeEnd = 10; 值= -4; 返回0

例3:

  • RangeStart = 0; RangeEnd = 10; 值= 23; 返回10

问题:我应该怎么称呼这样做的方法?我把它称为IntWithinRange,但我不认为我喜欢它.

有任何想法吗?

language-agnostic

5
推荐指数
3
解决办法
216
查看次数

我应该在重载方法上使用不同的返回类型吗?

是否有关于在重载方法上返回不同返回类型的最佳实践?例如,如果我在DAL中有一个Load方法,我要么加载一个项目或一堆项目.我知道我可以使用多种方法:

加载一个对象

MyBusinessObject LoadOne(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

加载多个对象

MyBusinessObject[] LoadMany(params int[] ids)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以做的是重载一个方法并具有不同的返回类型.像这样:

MyBusinessObject Load(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

MyBusinessObject[] Load(params int[] ids)
{
}
Run Code Online (Sandbox Code Playgroud)

虽然似乎没有什么可以阻止我这样做,并且从API的角度来看它保持整洁,这看起来是个好主意吗?我昨晚遇到它,部分我认为我不应该这样做是因为想要匹配重载方法的返回类型.

我也可以让Load(int id)方法返回一个只包含一个项目的集合.在我看来,这违反了最少惊喜的原则,但是如果你期望返回一个项目,你应该返回该项目,你不应该返回包含单个项目的列表.

所以这是围绕这些想法的矛盾思想:

  • 重载方法应该都返回相同的类型.
  • 如果方法做同样的事情,不要给它们一堆不同的名称,重载相同的方法名称.从API用户的角度来看,它使事情更简单,他们不必遍历一堆不同的方法,这些方法基本上都做同样的事情,但使用不同的参数.
  • 返回该方法最明显的类型,即如果用户可能期望收集项目,则返回项目集合,如果他们可能期望单个项目,则返回单个项目.

所以后两种想法比第一种想法更重要,但与此同时,第一种想法似乎是一种程序化的最佳实践.

有没有围绕这种做法的最佳做法?我有兴趣听听别人对这个问题的看法.

.net c#

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

.NET重构,DRY.双重继承,数据访问和关注点分离

背景故事:

因此,在过去的几个晚上,我一直坚持使用我一直在玩弄的重构器上的架构问题.没什么重要的,但它一直困扰着我.它实际上是DRY中的一个练习,并试图将它带到如DAL架构完全干燥的极端.这是一个完全哲学/理论的练习.

该代码部分基于@JohnMacIntyre的一个重构,我最近说服他在http://whileicompile.wordpress.com/2010/08/24/my-clean-code-experience-no-1上写博客. /.我倾向于稍微修改代码,以便将代码更进一步 - 通常,只是为了看看我可以从概念中获得多少额外的里程......无论如何,我的理由基本上是无关紧要的.

我的部分数据访问层基于以下架构:

abstract public class AppCommandBase : IDisposable { }
Run Code Online (Sandbox Code Playgroud)

这包含基本的东西,比如在处理AppCommand之后创建命令对象和清理.我的所有命令基础对象都源于此.

abstract public class ReadCommandBase<T, ResultT> : AppCommandBase
Run Code Online (Sandbox Code Playgroud)

这包含影响所有读命令的基本内容 - 特别是在这种情况下,从表和视图中读取数据.没有编辑,没有更新,没有保存.

abstract public class ReadItemCommandBase<T, FilterT> : ReadCommandBase<T, T> { }
Run Code Online (Sandbox Code Playgroud)

这包含一些更基本的通用内容 - 比如从数据库中的表中读取单个项所需的方法定义,其中表名,键字段名和字段列表名被定义为必需的抽象属性(待定义)由派生类.

public class MyTableReadItemCommand : ReadItemCommandBase<MyTableClass, Int?> { }
Run Code Online (Sandbox Code Playgroud)

它包含定义我的表名的特定属性,表或视图中的字段列表,键字段的名称,将数据从IDataReader行解析为业务对象的方法以及启动整个过程的方法.

现在,我的ReadList也有这个结构......

abstract public ReadListCommandBase<T> : ReadCommandBase<T, IEnumerable<T>> { }
public class MyTableReadListCommand : ReadListCommandBase<MyTableClass> { }
Run Code Online (Sandbox Code Playgroud)

不同之处在于List类包含与列表生成相关的属性(即PageStart,PageSize,Sort并返回IEnumerable)与单个DataObject的返回(只需要一个标识唯一记录的过滤器).

问题:

我讨厌我的MyTableReadListCommand类中有一堆属性在我的MyTableReadItemCommand类中是相同的.我已经考虑将它们移动到一个辅助类,但是虽然可以将成员内容集中在一个地方,但我仍然在每个类中都有相同的成员,而是指向帮助类,我仍然不喜欢它.

我的第一个想法是双重继承可以很好地解决这个问题,即使我同意双重继承通常是代码味道 - 但它会非常优雅地解决这个问题.那么,鉴于.NET不支持双继承,我从哪里开始呢? …

c# oop inheritance refactoring dry

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

如何处理单个多维数据集分区

我有一个多维数据集设置了多个分区 - 我的事实表每年都有一个分区.我想个别处理分区.这可能吗?如果是这样,我该如何解决这个问题呢?

谢谢

ssas sql-server-2008-r2

4
推荐指数
1
解决办法
6759
查看次数

如何在T-SQL中实现异或?

我有一个数据表,其中有一个列列表(对于此示例,归结为相关的列):

users(
  usr_pkey int identity(1, 1) primary key,
  usr_name nvarchar(64),
  ...,
)

accounts(
  acc_pkey int identity(1, 1) primary key,
  usr_key int foreign_key references users(usr_pkey),
  acc_effective datetime,
  acc_expires datetime,
  acc_active bit,
  ...,
)
Run Code Online (Sandbox Code Playgroud)

从这张表中我想抓住所有记录:

  • 该帐户属于指定的用户
  • 第一个例子:
    • 该帐户被激活今天的日期落在帐户的有效和到期日之间
  • 在第二个实例中:
    • 如果第一个实例没有识别出记录,则记录具有最近的到期日期.

所以 - 如果存在活动记录,其中今天的日期介于帐户的有效日期和到期日期之间,我想要该记录.只有在找不到匹配项时,我才希望该用户拥有最近的到期日期.

t-sql sql-server-2008 sql-server-2008-r2

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

重写.NET基类库中的现有功能

关于我昨天提到的关于日志记录的另一个问题,我被介绍给TraceListeners,我以前从未遇到过,并且非常希望我有.我无法计算我不必要地编写记录器的次数,没有人曾经指出过这个或者问我为什么不使用内置工具.这让我想知道我忽略了哪些其他功能,并且由于我不知道的.NET功能而不必要地写入我的应用程序.

有没有其他人拥有.NET的功能,如果他们只知道.NET已经内置了支持它的方法,那么它们会完全改变他们编写应用程序或应用程序组件的方式吗?

如果其他开发人员发布了经常遇到组件或代码块的情况,如果原始开发人员只知道内置的.NET组件(例如我之前提到过的TraceListeners),那么这将是非常方便的.

这并不包括的3.5本身的增值功能,但可以,如果相关的场景.

编辑 - 根据之前的评论,我对我之前记录的语言的"隐藏功能"并不感兴趣 - 我正在寻找通过我自己(或原始开发人员)无知的经常被忽视的框架组件不必要地编写/重写了自己的组件/类/方法.

.net c# vb.net asp.net

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

为什么我不能使用Type.GetType()来查找app.config中引用的插件实例的类型?

所以这是交易.我有我的解决方案,里面有几个项目:

  • 一个包装器项目 - 这只是一个控制台应用程序,在调试期间当前代表Windows服务.
  • 一个工人项目 - 这包含代码的内容.这样我就可以轻松地调试Windows服务的代码而不用担心.
  • 一个插件库项目 - 它包含一个插件工厂来创建一个插件的具体实例.
  • 一个插件项目 - 这包含我的插件的具体实现.

我的包装器应用程序包含我的app.config,我的插件应该直接引用自我配置.这样我的包装器应用程序除了需要调用适配器工厂来新建插件实例之外,不需要知道任何其他内容.

<configuration>
  <appSettings>
    <add key="Plugin" value="Prototypes.BensPlugin" />
    <add key="Prototypes.BensPlugin.ServiceAddress" value="http://localhost/WebServices/Plugin.asmx" />
    <add key="Prototypes.BensPlugin.Username" value="TestUserName" />
    <add key="Prototypes.BensPlugin.Password" value="TestPassword" />
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

包装项目:

using Worker;

public class Program
{
    public static void Main()
    {
        var serviceProc = new ServiceProcess();
        serviceProc.DoYourStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

工人项目:

using PluginLibrary;

namespace Worker
{
    public class ServiceProcess
    {
        public string GetRequiredAppSetting(string settingName)
        {
            /* Code to get a required configuration setting */
        }

        public …
Run Code Online (Sandbox Code Playgroud)

.net c# factory-pattern

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

当控制台应用程序使用完全相同的基本库执行完全相同的操作时,可能导致Windows服务挂起的原因是什么?

我讨厌这样的问题 - 它们是如此不确定......并且无法确定,但是这里有.

背景:我有一个DLL,它是一个定时进程的应用程序.我的计时器接收运行它的间隔的配置和一个应该在间隔过去时运行的委托.我有另一个DLL包含我注入的进程.

我创建了两个应用程序,一个Windows服务和一个控制台应用程序 每个应用程序读取自己的配置文件并加载相同的库,推送配置的计时器间隔并委托进入我的定时进程类.

问题:昨天和过去的n周,使用Windows服务在我们的生产环境中一切正常.今天,Windows服务将运行大约20-30分钟并挂起(计时器间隔为30秒),但控制台应用程序运行没有问题,并且在过去4小时内运行.详细记录不表示任何故障.好像Windows服务只是......悄然死去 - 没有停止.

鉴于我的Windows服务和控制台应用程序正在做同样的事情,我只能认为有一些东西导致Windows服务进程挂起 - 但我不知道是什么原因造成的.我检查了配置文件,它们都是相同的 - 我甚至将其中的内容复制并粘贴到另一个中以确保.没有骰子.

当使用相同基本库的对应控制台应用程序没有时,任何人都可以就可能导致Windows服务挂起的内容提出建议; 或者任何人都可以指向我的工具方向,这将允许我诊断可能导致此问题的原因?

感谢大家的帮助 - 仍然在挖掘.

c# windows-services

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

如何根据路径/网址选择图像?

我想根据他们的网址选择图片,但由于某种原因,它不是在玩球:

最终我追求的是:

var imgs = $("img[@src='images/object.png']:not(:hidden)");
Run Code Online (Sandbox Code Playgroud)

但即使是简单的事情:

$("img[@src='images/object.png']");
Run Code Online (Sandbox Code Playgroud)

抛出此错误:"TypeError:Object不支持此属性或方法".

如果我从查询中省略@:

$("img[src='images/object.png']");
Run Code Online (Sandbox Code Playgroud)

我没有退回任何物品.我在运行时直接从生成的html复制并粘贴了路径,但它仍然拒绝返回任何项目.如果我用id选择器替换src选择器,它将返回项目.

这是运行时生成的图像标记:

<img id="ctl00_ContentPlaceHolder1_object_1" src="images/object.png" style="height:16px;width:16px;border-width:0px;visibility:visible;display:inline;margin-right:3px;" />
Run Code Online (Sandbox Code Playgroud)

我正在运行jQuery 1.4.2并且我检查了所有文档,并且所有文档似乎都正确编码.我假设这不是一个错误,而是我的错误解释.任何人都可以对此有所了解吗?

干杯

jquery jquery-selectors

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

我可以从派生的AuthorizeAttribute访问我的控制器/动作/动词吗?

作为一个理论练习,帮助我学习与MVC相关的成员模型的细节,我想弄清楚我是否可以从外部资源加载权限,为了我的原型,我有一个平面文件,像这样的列表:

Controller1,Method1,Get,Anonymous
Controller1,Method1,Post,User,Administrator
Controller2,Method1,Get,Administrator
Controller2,Method1,Post,Administrator
Controller2,Method2,Get,User,Editor,Administrator
Controller2,Method2,Post,Editor,Administrator
Run Code Online (Sandbox Code Playgroud)

我可以使用正则表达式解析,以便为我提供一个对每个控制器/动作/动词组合具有权限的角色列表.

我有我的控制器动作:

[CustomAuthorize]
public ActionResult Index()
{
    /* Do stuff */
}
Run Code Online (Sandbox Code Playgroud)

我也有我的自定义授权组件:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        /* How do I access which Controller/Action/Verb fired this? */
    }
}
Run Code Online (Sandbox Code Playgroud)

为了能够在运行中确定哪些角色可以访问此控制器/动作/动词,我需要能够确定哪个控制器/动作/动词称为CustomAuthorize属性.

我知道我可以像这样向我的类添加属性:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Controller { get; set; }
    public string Action { get; set; }
    public string Verb { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后调用我的属性:

[CustomAuthorize(Controller="Home",Action="Index",Verb="Get")]
public ActionResult Index()
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-mvc

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