Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >构建一个返回用不同参数实例化的类实例的工厂?

构建一个返回用不同参数实例化的类实例的工厂?
EN

Stack Overflow用户
提问于 2019-07-25 15:42:50
回答 1查看 36关注 0票数 0

我正在为密码和用户名构建一个小型策略系统。这些策略可以基于各种不同的因素进行配置,但在大多数情况下,它们都是相对简单的。这些策略都实现了IPolicy,如下所示:

代码语言:javascript
运行
AI代码解释
复制
public interface IPolicy
{
    (bool, ErrorResponse) Verify(string input);
}

某些策略需要在实例化过程中向其传递某些参数,例如minimumLength。示例策略可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
public class LowerCasePolicy : IPolicy
{
    private const string _defaultTitle = "LowerCaseCount";
    private readonly int _minimumLength;
    private readonly string _errorMessage;
    private readonly string _errorTitle;

    public LowerCasePolicy(int minimumLength)
    {
        _minimumLength = minimumLength;
        _errorMessage =
            $"Password does not meet the lower case character count requirement set by the password policy ({_minimumLength})";
        _errorTitle = _defaultTitle;
    }

    public LowerCasePolicy(int minimumLength, string errorMessage, string errorTitle = _defaultTitle)
    {
        _minimumLength = minimumLength;
        _errorMessage = errorMessage;
        _errorTitle = errorTitle;
    }

    public (bool, ErrorResponse) Verify(string input)
    {
        var enoughUpper = Regex.Matches(input, "[a-z]").Count >= _minimumLength;
        return !enoughUpper ?
            (false, new ErrorResponse(_errorTitle, _errorMessage))
            : (true, null);
    }
}

我正在尝试建立某种类型的工厂,它能够通过不同的构造函数返回我所有不同的策略,但我不太确定从哪里开始。我想到的一个可能的选择是创建一个PolicyArgs基类来传递参数,我可以为每个参数使用派生类。如下所示:

代码语言:javascript
运行
AI代码解释
复制
public class PolicyArgs
{
    public string Title { get; set; }
    public string ErrorMessage { get; set; }
}

public class LowerCaseArgs : PolicyArgs
{
    public int MinimumLength { get; set; }
}

策略的构造函数现在将如下所示:

代码语言:javascript
运行
AI代码解释
复制
public LowerCasePolicy(PolicyArgs args)
{
    if (args == null)
        throw new ArgumentException();

    if (!(args is LowerCaseArgs lowerCaseArgs))
        throw new ArgumentException();

    _minimumLength = lowerCaseArgs.MinimumLength;
    _errorTitle = lowerCaseArgs.Title ?? _defaultTitle;
    _errorMessage = lowerCaseArgs.ErrorMessage ??  $"Password does not meet the lower case character count requirement set by the password policy ({_minimumLength})";
}

工厂看起来会像这样:

代码语言:javascript
运行
AI代码解释
复制
public class PolicyFactory
{
    private readonly Dictionary<Policy, Func<PolicyArgs, IPolicy>> _policyDictionary = new Dictionary<Policy, Func<PolicyArgs, IPolicy>>
    {
        [Policy.LowerCase] = (args) => new LowerCasePolicy(args)
    };

    public IPolicy Create(Policy policy, PolicyArgs args)
    {
        return _policyDictionary[policy](args);
    }
}

我不确定这是否真的是最好的方法,或者是否有更好的选择来处理具有不同构造函数需求的不同策略。我们的目标是能够简单地将这些配置放在数据库中,并让我的PolicyProvider有效地返回一个IPolicy数组。

正如所建议的,另一种选择是使用类似于字典的东西来处理附加参数,例如:

代码语言:javascript
运行
AI代码解释
复制
public class PolicyArgs
{
    public string Title { get; set; }
    public string ErrorMessage { get; set; }

    // There's almost definitely a better way to handle this;
    public Dictionary<string, object> AdditionalParameters { get; set; } = new Dictionary<string, object>();
}

public LowerCasePolicy(PolicyArgs args)
{
    if (args == null)
        throw new ArgumentException();

    if (!args.AdditionalParameters.ContainsKey("MinimumLength"))
        throw new ArgumentException("Minimum Length is not provided.");

    if (!int.TryParse(args.AdditionalParameters["MinimumLength"].ToString(), out var minimumLength))
        throw new ArgumentException("Minimum Length is invalid.");

    _minimumLength = minimumLength;
    _errorTitle = args.Title ?? _defaultTitle;
    _errorMessage = args.ErrorMessage ??  $"Password does not meet the lower case character count requirement set by the password policy ({_minimumLength})";
}

这种方法非常棒,因为它使得在数据库或应用程序配置文件中以JSON格式存储数据变得非常容易。然而,它有一些明显的缺点。首先,任何字符串中的类型都可能是灾难性的。它还需要我手动处理类型转换和检查。

我不反对这种方法,但我觉得肯定有更好的选择。

最初的用法(每个策略都有强类型的类)如下所示:

代码语言:javascript
运行
AI代码解释
复制
public void TestPolicyFactory()
{
    var args = new LowerCasePolicy.LowerCaseArgs {MinimumLength = 1};
    var factory = new PolicyFactory();
    var policy  = factory.Create(Policy.LowerCase, args);

    Assert.IsNotNull(policy);
}

更改后的字典如下所示:

代码语言:javascript
运行
AI代码解释
复制
public void TestPolicyFactory()
{
    var args = new PolicyArgs();
    args.AdditionalParameters.Add("MinimumLength", 1);
    var factory = new PolicyFactory();
    var policy  = factory.Create(Policy.LowerCase, args);

    Assert.IsNotNull(policy);
}
EN

回答 1

Stack Overflow用户

发布于 2019-07-25 16:04:11

老实说,你的问题会得到非常固执己见的答案,所以它可能不符合堆栈溢出规则。

我的观点是:

我会给我的所有策略一个相同的参数:一个字符串形式的json。我会避免继承,因为在将数据库反序列化为正确的类型时会遇到麻烦(数据库不适合多态集合)。

一旦进入你的类,你就可以将你的json反序列化为你的特定对象,如果不适合就抛出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57205813

复制
相关文章
JavaScript和jQuery添加和删除class类名
element.classList.remove("className") :删除类名
德顺
2019/11/13
2.8K0
JavaScript - 测试 jQuery
为了引用某个库,请使用 <script> 标签,其 src 属性设置为库的 URL:
陈不成i
2021/07/21
6150
javascript和jQuery修改a标签的href属性
a 标签的 href 属性值如何修改,下面分享一下使用 javascript 或 jQuery 的实现方法。  JavaScript: document.getElementById("myId").setAttribute("href","www.xxx.com");  document.getElementById("myId").href = "www.xxx.com"; jQuery: $("#myId").attr("href","www.xxx.com");
德顺
2019/11/13
4.6K0
jquery对象和javascript对象相互转换
本文转载:http://jeiofw.blog.51cto.com/3319919/786506
跟着阿笨一起玩NET
2018/09/19
4650
JavaScript、Jquery获取屏幕的宽度和高度
在日常的项目中经常需要获取屏幕的宽度或者高度,简单记录一下: Javascript方法获取: document.body.clientWidth //网页可见区域宽 document.body.clientHeight //网页可见区域高 document.body.offsetWidth //网页可见区域宽(包括边线的宽) document.body.offsetHeight //网页可见区域高(包括边线的高) document.body.scrollWidth //网页正文全文宽 document.b
德顺
2019/11/13
5.4K0
JavaScript强化教程——jQuery - 获得内容和属性
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuery - 获得内容和属性
IMWeb前端团队
2019/12/04
7150
JavaScript强化教程——jQuery - 获得内容和属性
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuery - 获得内容和属性。文章介绍了 jQuery 拥有可操作 HTML 元素和属性的强大方法,以及使用 jQuery 的 DOM 操作、获取内容、获取属性等方法。
IMWeb前端团队
2018/01/08
9730
JavaScript(19)jQuery HTML 获取和设置内容和属性
jQuery HTML jQuery 拥有可操作 HTML 元素和属性的强慷慨法。
全栈程序员站长
2022/07/12
1.4K0
JavaScript|jQuery基础语法
jQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程。jQuery是一个轻量级的"写的少,做的多"的JavaScript库。
算法与编程之美
2020/07/28
8020
JavaScript|jQuery基础语法
JavaScript 框架学习(JQuery)
参考: http://www.w3cschool.cc/jquery/jquery-tutorial.html
lpe234
2020/07/28
7.8K0
jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的。没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧。只是少了VS的Intelligence,有点不习惯罢了。
_淡定_
2018/08/24
1.7K0
JavaScript进阶内容——jQuery
我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库
秋落雨微凉
2022/10/25
5.5K0
JavaScript进阶内容——jQuery
jQuery 事件绑定 和 JavaScript 原生事件绑定
jQuery 中提供了四种事件监听绑定方式,分别是 bind、live、delegate、on,
Krry
2018/09/10
5.8K0
jQuery 事件绑定 和 JavaScript 原生事件绑定
JavaScript 动画_jquery 动画
回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程叫做回调。
全栈程序员站长
2022/11/04
2.4K0
JavaScript 学习-36.jQuery 获取和修改HTML
前言 jQuery 可以获取和修改HTML元素的属性和文本内容 text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) attr() - 获取或设置属性 val() - 设置或返回表单字段的值 获取文本 text() 和 html() text()是获取文本内容,html()返回所选元素的内容(包括 HTML 标记) <h3>获取html内容</h3> <div id="demo"> <p class="text-info">hello w
上海-悠悠
2022/05/31
8080
JavaScript 学习-36.jQuery 获取和修改HTML
JavaScript 学习-40.jQuery 绑定事件 on 和 bind
前言 jquery 有四种绑定事件的方式:on, bind, delegate,live。其中 live() 方法已被移除。 自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代。 $(selector).off(type)为元素解除绑定的事件 on 绑定事件 基本语法 $(selector).on(event,childSelector,data,function) 参数 描述 event 必需。事件的类型一个或多个,由空格分隔多个事件
上海-悠悠
2022/06/07
1K0
JavaScript 学习-40.jQuery 绑定事件 on 和 bind
jQuery VS JavaScript原生API
如今技术日新月异,各类框架库也是层次不穷。即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势。但JS原生API写法依旧;并且有时候只不过小写一个Demo,或者产品中只有少量的前端效果或DOM操作,就去花时间&空间引入jQuery,或者React?不免有取宰牛之刀以杀鸡之嫌。 在jQuery的温柔乡里,是否还能记得原生她javascript原生?如果仅为使用个选择器($)或者类似的东西,是否真的有必要加载jQuery?故此了解下JS常
晚晴幽草轩轩主
2018/03/27
1.6K0
JavaScript强化教程——jQuery 核心
本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— jQuety
IMWeb前端团队
2019/12/04
1.1K0
javaScript和jQuery获取、设置textarea标签的内容(取值和赋值)
通过 element.value 和 element.innerHTML 获取, .value 亲测有效。
德顺
2019/11/13
14.3K0
JavaScript与jQuery获取元素的宽、高和位置
今天汇总整理了 JavaScript 和 jQuery 获取元素宽高和位置的方法,比较全面,方便自己和需要并搜到此文章的朋友们查看。
德顺
2019/11/13
3.1K0

相似问题

混合使用javascript和jquery

10

Onchange是javascript和jquery代码的混合。

11

常规JavaScript可以和jQuery混合使用吗?

41

混合javascript,jQuery和PHP,换行符

10

将javascript与jquery混合

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文