我遇到的问题是我需要做大约40多次转换才能将松散类型的信息转换为存储在db,xml文件等中的强类型信息.
我打算用元组标记每种类型,即这样的转换形式:
host.name.string:host.dotquad.string
Run Code Online (Sandbox Code Playgroud)
它将提供从输入到输出表单的转换.例如,名称存储在字符串类型的主机字段中,输入转换为字符串类型的dotquad表示法并存储回主机字段.更复杂的转换可能需要几个步骤,每个步骤都是通过方法调用完成的,因此方法链接.
进一步检查上面的例子,元组'host.name.string'的字段主机名为www.domain.com.执行DNS查找以将域名转换为IP地址.应用另一种方法将DNS查找返回的类型更改为string类型的dotquad的内部类型.对于这种转换,有4个单独的方法被称为从一个元组转换为另一个元组.其他一些转换可能需要更多步骤.
理想情况下,我想了解一个在运行时如何构造方法链的小例子.开发时间方法链接相对简单,但需要页面和代码页来覆盖所有可能性,并且需要40多次转换.
我想做的一种方法是,在启动时解析元组,并将链写出到一个程序集,编译它,然后使用反射来加载/访问.它真的很丑陋,否定了我希望获得的性能提升.
我正在使用Mono,所以没有C#4.0
任何帮助,将不胜感激.鲍勃.
我正在编写一个jQuery插件,在某些情况下存储一些数据.
我想以一种非常灵活的方式编写它,我可以更改输入参数以获取插件存储的某些值.
说明:
当我打电话$("#any").myPlugin(),我的插件初始化创建div和一些a内.单击a将.index()使用该.data()方法存储它.如果我打电话,$("#any").myPlugin("getSelection")那么我想得到存储的值.data().
我尝试过的:
(function ($) {
$.fn.myPlugin = function (action) {
if (action == null) action = "initialize";
return this.each(function ($this) {
$this = $(this);
if (action == "initialize") {
$this.html('<div></div>');
var div = $("div", $this);
div.append('<a>A</a>').append('<a>B</a>').append('<a>C</a>');
div.children("a").each(function (i) {
$(this).click(function (event) {
// Here I store the index.
$this.data($(this).index());
event.preventDefault();
return false;
});
});
return $this;
} else if (action == …Run Code Online (Sandbox Code Playgroud) 在使用jQuery之前,我可以做一个链接动画,延迟时间如下:
$("#element").delay(45).animate({ }, 45)
.delay(45).animate({ }, 45)
.delay(45).animate({ }, 45);
Run Code Online (Sandbox Code Playgroud)
现在,自从更新到v1.6.1而不是执行之前的操作之后,它现在跳到最后一个动画.忽略之前的陈述.我知道我可以为每个动画做一个不完整的回调,但这只是弄乱了:
$("#element").delay(45).animate({ }, 45, function(){
$("#element").delay(45).animate({ }, 45, function(){
$("#element").delay(45).animate({ }, 45);
})
})
Run Code Online (Sandbox Code Playgroud)
有谁知道如何以简单干净的方式实现这一目标?
我现在拥有的:
var result = $('selector1');
if (result.length == 0) result = $('selector2');
Run Code Online (Sandbox Code Playgroud)
但是这会打败链子.
问题是 - 如何使用JQuery链接获得相同的结果?
我不能使用$('selector1, selector2'),因为这总是会为两个选择器选择结果集,而我selector2只有在没有匹配元素时才需要结果selector1.
我想将两个(可能更多的未来)方法链接到一个委托,并且想知道是否有办法在一个赋值语句中执行此操作,例如
我有一个委托方法签名定义为
public delegate void MaskRequestSection(Request request);
Run Code Online (Sandbox Code Playgroud)
...和使用此签名的2种方法,即......
public void MaskCvnSection(Request request)
{
// do the masking operation
}
public void MaskCardNumberSection(Request request)
{
// do the masking operation
}
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用以下实例化delegete,将2个方法链接到它然后调用它们...
private void HideDetailsInRequest(Request request)
{
MaskRequestSection maskRequestSection = MaskCvnSection;
maskRequestSection += MaskCardNumberSection;
maskRequestSection(request);
}
Run Code Online (Sandbox Code Playgroud)
....我只是好奇为什么我不能在下面的一个声明中链接两个代表,
MaskRequestSection maskRequestSection = MaskCardNumberSection+ MaskCvnSection;
Run Code Online (Sandbox Code Playgroud)
......但是如果有另一种方式可以在一个声明中完成.我无法在MSDN上找到任何专门针对此问题的内容,而我只是在问自己的好奇心.
提前致谢.
问题:使用许多方法实现流畅的接口会使类复杂度指标增长得非常快.
如何保持实现流畅界面的类的低复杂性?
有关特定课程的一些信息:
$this->wrapped某种方式转换对象.已经考虑过选项:
@method注释添加自动完成支持.高度期待任何选项的反馈(关于设计,性能,可维护性等).
检查过的例子:
Doctrine2 QueryBuilder:40 + 40-ish方法,2个类,1400 + 600行代码; 通过ExpressionBuilder课程分开
Symfony2 FormBuilder:10-areh暴露方法,1类,300行
问题可以被认为是与语言无关的 - 从PHP实现和设计观点的答案都同样受欢迎.
编辑:
目的是对函数式编程尼斯(易于使用和易于维护)工具(map,reduce,等)
我无法理解链接承诺的错误处理的基本概念.为了学习规则,我写了一个简单的例子,猜测结果是什么.但不幸的是,它不会像我一样表现.我已经阅读了很多关于这个主题的文章,但由于我的英语不好,我可能无法得到细节.
无论如何,这是我的代码:
var promiseStart = $q.when("start");
var promise1 = promiseStart.then(function() {
return Serviceforpromise1.get();
});
var promise2 = promise1.then(function(data1)
{
return Serviceforpromise2.get(data1);
},function(error)
{
return $q.reject();
});
var promiseend = promise2.then(function(data2)
{
return data2;
},function(error)
{
return error;
});
return promiseend;
Run Code Online (Sandbox Code Playgroud)
嗯,我知道它可以更好地编码,但它只是为了这个目的.以下是Serviceforpromise1函数的代码:
function Serviceforpromise1()
{
...
return $http.get(*whatever*).then(function (data){
return data;
},function(error)
{
return $q.reject();
});
}
Run Code Online (Sandbox Code Playgroud)
仅考虑Serviceforpromise1失败的情况.一个$ q.rejec t被送回主链上,所以我在等待的"错误回调promise1.然后( "被称为和它的工作如预期,我决定为例子错误transfert到" promise2.然后 "所以在这个错误回调我添加了行返回$ q.reject() ;但它从未达到第二个错误回调(" promise2 .then "一个)我不明白为什么(像Serviceforpromise1,我返回了一个拒绝承诺!)
我很乐意深入了解这里发生的事情.谢谢你的帮助.
当我读到这个答案时,找到var g = f.call.bind(f);.我第一眼看不到这一点.
那么它有一些直接意义,并有一些适当的使用场景吗?
当你在链接中使用call(or apply)或者bind同时使用时,会发生什么?有一些法律吗?
我知道这不是很傻,但如何开始一个承诺链?我有,例如,
var p = new Promise(function(resolve,reject) {
setTimeout(function() {
return resolve("Hi from promise after timeout");
},1000);
});
Run Code Online (Sandbox Code Playgroud)
怎么运行呢?它应该是这样的,
when(p)
.then(function(msg) {
console.log(msg);
})
.catch(function(error) {
console.error(error);
});
Run Code Online (Sandbox Code Playgroud)
但是when没有定义.
我的同事首选的Java 8编码风格一直在链接异步调用,例如
CompletionStage<E> someMethod() {
return doSomething().thenCompose(a -> {
// ...
return b;
}).thenCompose(b -> {
// ...
return c;
}).thenCompose(c -> {
// ...
return d;
}).thenApply(d -> {
// ...
return e;
});
}
Run Code Online (Sandbox Code Playgroud)
我有类似上面的内容,但有一个额外的挑战:我需要回忆一些lambda中检索到的值,在后来的lambda中.例如,
CompletionStage<E> someMethod() {
return doSomething().thenCompose(a -> {
// ...
Foo foo = fooDAO.getFoos(a);
// ...
return b;
}).thenCompose(b -> {
// ...
return c;
}).thenCompose(c -> {
// ...
Bar bar = barDAO.getBars(foo);
// ...
return d;
}).thenApply(d -> {
// ... …Run Code Online (Sandbox Code Playgroud)