gpt4 book ai didi

java - 我的新 DOM api : jquery-alike or with getters/setters?

转载 作者:行者123 更新时间:2023-11-30 09:43:32 27 4
gpt4 key购买 nike

我构建了一个基于事件的 java html 解析器:Lagarto .现在我正在研究 DOM 构建器,它使用解析器创建 DOM 树。同时,我开发了 CSS3 选择器节点过滤器 java 库,可以很好地与这个 DOM 树配合使用。

我最初的想法是使用类似于 JQuery 的 API 设计 DOM 类。例如,要读取一个属性,用户会调用:

element.attr("name");

类似地,要设置一个属性,用户会调用:

element.attr("name", "value");

但是,这种方法打破了 Java 中获取和设置事物的通常方式。现在我无法决定我是否应该:

  • 为我的 DOM 类构建类似 jquery 的 API。与 CSS3 选择器库一起,这将使一切都非常类似于 jquery
  • 使用 getter 和 setter 构建 DOM 类。例如,我不确定它们是否会被某些 beanutil 库使用;而且,出于这个目的,它对我来说看起来并不那么漂亮和流畅。

问题:如果您必须构建自己的 DOM 库,您会从上面选择什么?

当然,这个没有正确答案:) 因此我会接受符合我最终决定的答案 - 但这并不意味着另一个解决方案不正确!

最佳答案

我认为更好的方法是两者都做(令人惊讶的是,就像在 jquery 中一样,它不仅是 DOM 库,而且是浏览器 DOM 的包装器)。因此,您将拥有带有 DOM getter/setter 的经典 java 对象和一个环绕 DOM 对象以提供流畅 API 的 $-library。

接下来是SRP , 所以 DOM 对象非常简单和最小,只有必需的方法,setters/getters 出现在 DOM API 中 - 易于支持和测试。然后创建一百万个用户友好的 $-wrappers 以在更少的代码中使用 DOM 对象。

更新

public class DomElement
{
void insertChild(int pos, DomElement) {...}
void setAttribute(String name, String value){...}
String getAttribute(String name) {}
}
...
public class JQuery
{
private final List<DomElement> els;
public static JQuery $(DomElement ...e)
{
return new JQuery(Arrays.asList(e));
}
...// some more methods which allow to create $-object with some other ways.

private JQuery(List<DomElement> els)
{
this.els = els;
}

public String attr(String name)
{
return els.get(0).getAttribute(name);
}
public JQuery attr(String name, String value)
{
for(DomElement el : els)
el.setAttribute(name, value);
return this;
}
...
}

现在我们使用它:

$(anElem1, anElem2)
.attr("class", "myClass")
.attr("width", w);

来 self 的实验项目

有几个片段,我希望它足以给出设计的想法。

public class JQuery
{

private final List<HElement> es;
private final JQuery parent;
public interface Func<T>
{
T apply(final HElement element, final int index);
}

static public JQuery $(HElement e)
{
return new JQuery(null, e == null ? Collections.<HElement>emptyList() : Collections.singletonList(e));
}

static public JQuery $(Collection<HElement> es)
{
return new JQuery(null, new ArrayList<HElement>(es));
}

static public JQuery $(String selector, HElement e)
{
return new JQuery(null, e.selectAll(selector));
}

static public JQuery $(String selector, HtmLayout layout)
{
return new JQuery(null, layout.getRoot().selectAll(selector));
}

static public JQuery $(String selector, Collection<HElement> es)
{
final ArrayList<HElement> result = new ArrayList<HElement>();
for(HElement e : es)
{
result.addAll(e.selectAll(selector));
}
return new JQuery(null, result);
}


public JQuery find(String selector)
{
final ArrayList<HElement> result = new ArrayList<HElement>();
for(HElement e : es)
result.addAll(e.selectAll(selector));
return new JQuery(this, result);
}

public JQuery text(String value)
{
for(HElement e : es)
{
e.setInnerText(value);
}
return this;
}

public String text()
{
final StringBuilder value = new StringBuilder();
for(HElement e : es)
{
value.append(e.getInnerText());
}
return value.toString();
}

public int size()
{
return es.size();
}
public JQuery children()
{
final List<HElement> result = new ArrayList<HElement>(size());
for(HElement e : es)
for (HElement c : e.children())
if(c!=null)// Avoid null TD in TR
result.add(c);
return new JQuery(this, result);
}

public JQuery children(String selector)
{
return children().filter(selector);
}

public JQuery filter(final String selector)
{
final List<HElement> result = new ArrayList<HElement>(size());
for(HElement e : es)
{
if(e.selectParentOrSelf(selector, 1) != null)
result.add(e);
}
return new JQuery(this, result);
}


}

关于java - 我的新 DOM api : jquery-alike or with getters/setters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8293525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com