我正在编写RenderContents()ASP.NET服务器控件的方法.该方法使用HtmlTextWriter对象来呈现输出内容.对于我正在编写的控件,使用这些HtmlTextWriter方法似乎需要很多行代码来打开和关闭每个标记并将每个属性添加到流中.最后,我觉得我最终会得到比它需要的时间长得多的代码.
我在想,如果我使用了一个可链接的类StringBuilder,我的代码会更清晰,更容易编写.
我想知道的是,有没有理由使用该HtmlTextWriter对象来呈现我的整个控件的内容?除了安全检查(我假设),它包括确保您不以错误的顺序写标签或创建无效标记,我没有看到原因.
看起来像这样做会更容易:
protected override void RenderContents(HtmlTextWriter output)
{
StringBuilder s = new StringBuilder();
s.Append("lots")
.Append("of")
.Append("strings");
output.BeginRender();
output.Write(s.ToString());
output.EndRender();
}
Run Code Online (Sandbox Code Playgroud)
有什么理由说这是个坏主意吗?
更新
响应Mehrdad Afshari的回答:
我没有考虑StringBuilder实例化单独对象的内存要求.如何为HtmlTextWriter创建一个包装器,以便它可以被链接,以便不会产生额外的字符串.
public class ChainedHtmlTextWriter
{
private HtmlTextWriter _W;
public ChainedHtmlTextWriter(HtmlTextWriter writer)
{
_W = writer;
}
public ChainedHtmlTextWriter Write<T>(T value)
{
_W.Write(value);
return this;
}
public ChainedHtmlTextWriter WriteLine<T>(T value)
{
_W.WriteLine(value);
return this;
}
}
Run Code Online (Sandbox Code Playgroud) asp.net stringbuilder servercontrols htmltextwriter method-chaining
我想生成方法链接setter(返回正在设置的对象的setter),如下所示:
public MyObject setField (Object value) {
this.field = value;
return this;
}
Run Code Online (Sandbox Code Playgroud)
这样可以更容易地进行单行实例化,我觉得更容易阅读:
myMethod (new MyObject ().setField (someValue).setOtherField (someOtherValue));
Run Code Online (Sandbox Code Playgroud)
是否可以修改Eclipse的模板来执行此操作?我已将内容更改为包含return this;但签名未更改.
当涉及到工厂类和方法,模式等的使用时,我是一个完全新手 - 实际上我在浏览Java相关问题时首先在Stackoverflow上学到了它们:-)
为了回应我之前的一个问题,建议我在开发GUI的过程中研究Builder模型的使用,因此我正在寻找易于理解的示例,演示应用程序的用户界面如何使用此模式和方法链等
谢谢阅读.
是否可以配置resharper来切断方法链中的所有方法
例如
var query = list.Where(x => true).Select(x => x);
Run Code Online (Sandbox Code Playgroud)
变
var query = list
.Where(x => true)
.Select(x => x);
Run Code Online (Sandbox Code Playgroud)
如果没有,那么是否可以配置resharper在格式化时忽略方法链?因此,我可以手动切割文本,而不必担心resharper重新格式化它.
我想处理一系列数据,其中每个数据的输出可以用作其他数据的输入.
例如:
var batch = [
{"id":"a1","depends":[],"data":{"some":"data a1"}},
{"id":"b1","depends":["a1"],"data":{"some":"data b1"}},
{"id":"b2","depends":["a1"],"data":{"some":"data b2"}},
{"id":"c1","depends":["b1","b2"],"data":{"some":"data c1"}},
{"id":"x1","depends":[],"data":{"some":"data x1"}},
];
Run Code Online (Sandbox Code Playgroud)
这意味着一旦a1完成,其输出将被发送到两者b1并且b2; 当这些完成时,既它们的输出的将被发送到c1(仅在两个其完成的.
x1可以并行与所有的执行a1,b1,b2,和c1;以及b1在具有平行可以执行b2,因为没有depends在它们之间定义.
完成c1并x1完成所有5个后,应归还所有五个的输出.
我们假设没有定义循环依赖,因此是有向无环图(DAG)
我想知道如何使用Q实现这个,因为:
但是,我未能将这个过去概念阶段
var doPromises = {};
var doData = function(data, dependsResultsHash, callback) {
//Not real processing, simply echoes input after a delay for async simulation purposes …Run Code Online (Sandbox Code Playgroud) 更新:我明白了!事实证明,鲍里斯蜘蛛的"GENERICS"评论正是我所需要的线索.
原始问题和破碎的代码首先,解决方案如下.我的通用设计需要下面的needer.
在过去的几年中,我一直试图让自我回归的方法链与其他类"共享".这是为了避免必须复制每个子类中的每个自返回函数的巨大痛苦.基本思想是将"needer"类传递给"needable"类以开始配置,然后在配置结束时将needer传递回去."required"对象在内部设置.
例如:
ConfigUser cu = (new ConfigUser()).
cfgFavNum().twentySeven().increment().timesTwo().endCfg().
firstName("Kermit").lastName("Frog");
Run Code Online (Sandbox Code Playgroud)
哪里
firstName("Kermit").lastName("Frog")
Run Code Online (Sandbox Code Playgroud)
是ConfigUser类的一部分,和
twentySeven().increment().timesTwo().endCfg()
Run Code Online (Sandbox Code Playgroud)
来自一个单独的"配置数字"类.endCfg()返回"needer"类(ConfigUser),此时您应该能够在ConfigUser中继续链返回.但你不能.在下面的代码中......在我所做的每一次尝试中,我最终都得到了同样的错误:
C:\java\ConfigUser.java:4: cannot find symbol
symbol : method firstName(java.lang.String)
location: interface NeedsFavNum
cfgFavNum().twentySeven().increment().timesTwo().endCfg().
^
Run Code Online (Sandbox Code Playgroud)
如果您在endCfg()发现问题后将其全部注释掉:
ConfigUser cu = (new ConfigUser()).
cfgFavNum().twentySeven().increment().timesTwo().endCfg();//.
//firstName("Kermit").lastName("Frog");
C:\java\ConfigUser.java:15: incompatible types
found : NeedsFavNum
required: ConfigUser
cfgFavNum().twentySeven().increment().timesTwo().endCfg();//.
^
Run Code Online (Sandbox Code Playgroud)
它不能返回ConfigUser,这是子类的 NeedsFavNum,这是所有类的"需要"最喜欢的号码,配置的接口.
当然,您可以复制所有函数,以便它们返回ConfigUser-s,但这会破坏共享链的目的.目的是在任何类中共享这些链,而不仅仅是子类.
有没有办法实现这一目标,或重新思考整个问题?我开始认为这根本不可能.
详细信息如下代码所示.它的工作原理(......无论如何都要解决这些编译错误):将其复制到名为ConfigUser.java的文件中并尝试一下.
感谢你们对我的帮助.
public class ConfigUser implements NeedsFavNum {
public static final void main(String[] igno_red) …Run Code Online (Sandbox Code Playgroud) 我想我已经或多或少地设法掌握了OOP /继承,并且我认为我也理解了方法链的基础知识.但是我仍然对如何实际使用它们感到困惑.
我想做一些我以前在Magento工作时看到过的东西:在Magento中,我看到过某种用于方法链接的"选择器功能".这有点难以言喻,但它有点像:
$categoryName = Mage::getModel('catalog/category')->load($categoryId)->getName();
Run Code Online (Sandbox Code Playgroud)
load($categoryId)这是让我感兴趣的部分,例如,选择某个实例的函数并允许我在该特定实例上运行函数.
现在,我正在编写一个模块,允许我在我们的网站上配置某些促销活动.看到我们将有许多不同的促销活动,我希望它们易于配置和修改,我想做类似的事情.
所以,如果我想做这样的事情:
$prm = new Promotion();
$prm->addPromo('xmasPromo');
$prm->addPromo('nyPromo');
$prm->getPromo('xmasPromo')->setName('Promotion for Xmas!');
$prm->getPromo('nyPromo')->setName('Promotion for New Years!');
echo $prm->getPromo('xmasPromo')->getName(); // returns: Promotion for Xmas!
echo $prm->getPromo('nyPromo')->getName(); // returns: Promotion for New Years!
Run Code Online (Sandbox Code Playgroud)
那个类的定义怎么样呢?
这可能比我预期的要简单得多或复杂得多.在任何一种情况下,非常感谢!
编辑:所以我做了一些测试,信息deceze给了我,但我仍然感到困惑.错误命名并将2个类放在1个文件中,这就是我所做的:
类文件:
class Promotion {
private $__arr = array();
public function addPromo($name) {
$this->__arr[$name] = new Promo();
}
public function getPromo($name) {
$this->__arr[$name];
}
}
class Promo {
private $name;
public function setName($name) {
$this->name = $name;
}
public function …Run Code Online (Sandbox Code Playgroud) 我想知道如何链接我的自定义函数并维护'this'的上下文.
例:
$.fn.foo = function() {
var html = '<div class="foo"></div>';
if ($(this).hasClass(somthing) {
$(this).prepend(html);
}
}
$.fn.bar = function() {
var html = '<h3>bar</h3>';
$(this).find('.foo').prepend(html);
}
$('body').foo().bar();
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此代码时,我得到一个TypeError:无法读取未定义的属性"bar"
假设我有一类Test包含大约10-20个方法的方法,所有方法都是可链接的。
在另一种方法中,我需要执行一些异步工作。
let test = new Test();
console.log(test.something()); // Test
console.log(test.asynch()); // undefined since the async code isn't done yet
console.log(test.asynch().something()); // ERROR > My goal is to make this
Run Code Online (Sandbox Code Playgroud)
由于其他所有方法都是可链接的,因此,如果不是这种唯一的方法,我觉得对用户来说很奇怪。
我有办法保持班级的可链接主题吗?
我已经想通过下一个方法在这个方法的参数内的回调函数,但它不是真正的链接。
test.asynch(() => something())
Run Code Online (Sandbox Code Playgroud)
与相同Promises,它并不是真正的链接。
test.asynch().then(() => something())
Run Code Online (Sandbox Code Playgroud)
我想要的结果是
test.asynch().something()
Run Code Online (Sandbox Code Playgroud)
这是一个演示我的问题的代码段:
let test = new Test();
console.log(test.something()); // Test
console.log(test.asynch()); // undefined since the async code isn't done yet
console.log(test.asynch().something()); // ERROR > My goal is to make …Run Code Online (Sandbox Code Playgroud)method-chaining ×10
javascript ×3
java ×2
jquery ×2
asp.net ×1
asynchronous ×1
eclipse ×1
graph ×1
graph-theory ×1
inheritance ×1
oop ×1
php ×1
q ×1
resharper ×1
swing ×1