我正在为一种玩具语言实施算法 W。我遇到了一个我认为会进行类型检查的案例,但事实并非如此。我在 Haskell 中尝试了同样的方法,但令我惊讶的是它在那里也不起作用。
> (\id -> id id 'a') (\x -> x)
Couldn't match type ‘Char -> t’ with ‘Char’
Expected type: Char -> t
Actual type: (Char -> t) -> Char -> t
Run Code Online (Sandbox Code Playgroud)
我认为这id将是多态的,但似乎不是。请注意,如果id使用 let 而不是作为参数传递定义,则此示例有效:
let id x = x in id id 'a'
'a'
:: Char
Run Code Online (Sandbox Code Playgroud)
在查看算法 W 的推理规则时,这是有道理的,因为它具有 let 表达式的泛化规则。
但我想知道这是否有任何原因?函数参数不能被泛化,以便它可以多态使用吗?
我有一个涉及三个表的公共数据库连接情况.一个表A是主表,主键名为id.表B和C包含条目和A的辅助数据,并且每个表还有一个名为的列id,它是指向A.的外键id.现在,如果我想在一个查询中获得A,B和C中的所有数据,我会写:
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id
Run Code Online (Sandbox Code Playgroud)
这当然是完美的.
最近,我们的DBA告诉我们这在Oracle中效率很低,你需要加入C和B之间的条件,如下所示:
SELECT *
FROM A
INNER JOIN B
ON B.id = A.id
INNER JOIN C
ON C.id = A.id AND C.id = B.id
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来多余,所以我自然不相信这里.直到我遇到一个执行计划很糟糕的慢查询,并设法通过精确添加缺少的连接条件来修复它.我在两个版本上运行了解释计划:没有"冗余"查询条件的那个版本的成本为1 035,而"改进的"版本的成本为389(并且基数和字节也存在巨大差异).两个查询都产生完全相同的结果.
谁能解释为什么这个额外的条件有所作为?对我来说,C和B甚至没有关系.还要注意,如果你带走其他连接条件,它同样糟糕 - 它们都需要在那里.
我对在 JSF 中创建动态组件感兴趣。我的意思是一个组件,其外观和行为取决于所传递的变量而有所不同。
让我们举一个实际有效的简单例子。一个复合组件(facelet),根据数据隐藏/显示其自身的不同部分。在本例中,它采用名为“myBean”的属性,您可以想象该属性具有“值”字段和“类型”字段。“type”字段决定应该渲染什么组件。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="myBean" />
</cc:interface>
<cc:implementation>
<!-- Small input field if type is "shorttext" -->
<h:inputText value="#{myBean.value}" rendered="#{myBean.type == 'shorttext'}" />
<!-- Text area input field if type is "longtext" -->
<h:inputTextArea value="#{myBean.value}" rendered="#{myBean.type == 'longtext'}" />
</cc:implementation>
</html>
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它很快就会变得笨拙。如果我有二十种不同的类型,我将它们全部指定在同一个文档中,这显然违反了良好的设计。
相反,我希望能够用以下内容替换实现:
<ui:include value="#{myBean.type}"/>
Run Code Online (Sandbox Code Playgroud)
我理解这是不可能的,因为ui:include在构建组件树时发生,并且组件在渲染阶段进行处理。
但这一定是一个普遍的问题。实现动态组件的最佳方法是什么?我正在使用 JSF 2.0,如果这有什么区别的话。
我正在通过@Transactional注释向现有Java项目添加Spring声明性事务.
当我遇到问题(与此问题无关)时,我打开了完整的调试日志记录.奇怪的是,我注意到以下几点:
17:47:27,834 DEBUG HibernateTransactionManager:437 - Found thread-bound Session [org.hibernate.impl.SessionImpl@10ed8a8e] for Hibernate transaction 17:47:27,845 DEBUG HibernateTransactionManager:470 - Participating in existing transaction 17:47:27,865 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'updateUserProfile' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 17:47:27,875 DEBUG AnnotationTransactionAspect:321 - Skipping transactional joinpoint [se.myservice.UserService.updateUserProfile] because no transaction manager has been configured
经过一些调试后,我发现前三个日志条目,它说它找到一个线程绑定会话并使用该事务,由我的UserService类上的JdkDynamicAopProxy生成.
最后一条日志消息看起来很惊人.它在方法执行之前在连接点调用.查看AnnotationTransactionAspect的源时,如果未设置事务管理器,则会生成此消息.在这种情况下,因为Spring从不在这方面执行任何依赖注入.
在我看来,两种不同的"风格"交易都适用:动态代理和方面.我唯一与事务相关的配置是:
<tx:annotation-driven transaction-manager="txManager" />
Run Code Online (Sandbox Code Playgroud)
我们在项目中使用了AspectJ,但是在我的aop.xml中没有注册AnnotationTransactionAspect方面.我们正在使用Spring 3.0.2.RELEASE.
我应该对此感到震惊吗?Spring会为我注册这方面吗?annotation-driven使用AspectJ时我不应该使用吗?
我们有一个大型 Web 应用程序,主要使用 KnockoutJS 构建。我正在考虑是否有可能迁移到 React,但需要重写整个应用程序。我的想法是使用自下而上的方法:从一一替换基本构建块开始。
我受到之前一些工作的启发,在 KnockoutJS 绑定处理程序中调用 ReactDOM.render:
ko.bindingHandlers.react = {
init() {
return {controlsDescendantBindings: true};
},
update(element, valueAccessor) {
const {component, props} = valueAccessor();
ReactDOM.render(React.createElement(component, props), element);
}
};
Run Code Online (Sandbox Code Playgroud)
Knockout 有自己的依赖跟踪系统,因此每当某些数据发生变化时它就会调用 update 方法。
它工作完美,并且组件被重新渲染以反映数据的任何更改。然而,当数据在 React 事件处理程序中更新时,它就会崩溃。例如,该组件无法按预期工作:
const Input = function ({value}) {
return <input type="text"
value={value()}
onChange={e => value(e.target.value)}/>;
}
Run Code Online (Sandbox Code Playgroud)
注意:本例中的 value 是一个 ko.observable,像在事件处理程序中一样调用它会导致调用 bindingHandler 的 update 方法,进而调用 ReactDOM.render。但是,此渲染仅有效一次,之后组件将停止更新。
此 CodePen 中演示了该问题。单击该框并尝试输入一些内容。经过一次更新后,组件的函数将停止被调用。
编辑:我认为问题在于对 ReactDOM.render 的第二次调用(当用户在 onChange 处理程序中更新值时)不同步。这意味着 Knockout 的依赖项检测无法工作,并且任何后续调用都不再调用绑定处理程序的 update 方法。
这可以以某种方式规避吗?
我计划在现有的Web应用程序中实现缓存解决方案.没有什么复杂的:基本上是支持溢出到磁盘和自动驱逐的并发映射.未来可能需要对缓存进行群集,但现在不需要.
我喜欢ehcache的copyOnRead和copyOnWrite功能,因为这意味着在修改我从缓存中取出的内容之前,我不必手动克隆内容.现在我已经开始关注Infinispan了,但我还没有找到相应的东西.它存在吗?
即,以下单元测试应通过:
@Test
public void testCopyOnWrite() {
Date date = new Date(0);
cache.put(0, date);
date.setTime(1000);
date = cache.get(0);
assertEquals(0, date.getTime());
}
@Test
public void testCopyOnRead() {
Date date = new Date(0);
cache.put(0, date);
assertNotSame(cache.get(0), cache.get(0));
}
Run Code Online (Sandbox Code Playgroud) 我对<ui:repeat>标签有一个奇怪的问题.即使对于我非常简单的示例,嵌套重复组件中的值绑定也无法按预期工作.
我有一个像这样的简单小脸:
<h:body>
<h:form>
<ui:repeat value="#{sandbox.rows}" var="row">
<ui:repeat value="#{row.columns}" var="column">
<h:outputText value="#{column.value}" />
<h:selectBooleanCheckbox value="#{column.value}" />
</ui:repeat>
<br/>
</ui:repeat>
<h:commandButton action="#{sandbox.refresh}" value="Refresh" />
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)
和沙盒类:
@Component
@Scope("request")
public class Sandbox {
public static class Row {
private List<Column> columns = Arrays.asList(new Column(), new Column());
public List<Column> getColumns() {
return columns;
}
}
public static class Column {
private boolean value;
public void setValue(boolean value) {
this.value = value;
}
public boolean getValue() {
return this.value;
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个在JBoss 4.2.2上运行的Web应用程序.为了监控性能,我启用了Java 5附带的内部平台JMX服务器.换句话说,我添加了:
-Dcom.sun.management.jmxremote
Run Code Online (Sandbox Code Playgroud)
到JBoss的启动脚本.这按预期工作.但是,因此,所有MBean现在都在平台MBeanServer上注册.我不希望这样,我希望它们在JBoss的MBeanServer上注册.
困难在于我使用Spring来注册我的托管bean.为此,MBeanExporter使用.因此,我需要告诉我MBeanExporter在注册bean时使用JBoss的MBeanServer.但是,MBeanExporter影响使用服务器的唯一暴露方法是setServer(MBeanServer mBeanServer).问题是我只知道如何以编程方式获取对正确的MBeanServer的引用,而不是在声明的Spring的XML中MBeanExporter.
我的选择似乎是:
MBeanExporter,覆盖某些方法,以便加载正确的MBeanServerPostBeanProcessor找到JBoss的MBeanServer,然后调用setServer什么是最惯用的方式?我做的事真的很傻吗?
我正在编写脚本remote.ini.脚本看起来像
on 1:start:{
server some.irc.server
server -m another.irc.server
}
Run Code Online (Sandbox Code Playgroud)
该脚本运行良好,因为当我打开mIRC时,它会自动连接到上面的2个服务器
现在,我想连接到需要密码的irc服务器 abcdef
如何编写脚本remote.ini以连接到此服务器?
这可能是一个奇怪的问题,但它实际上让我有点头疼.
在面向对象编程中,关键概念有可接受的名称.在我们的模型中,我们有包含方法和字段的类.现在,转到数据世界:
一个值?这个术语的价值不是很宽泛吗?我也被提供"财产",但不是财产也是模型的一部分,而不是数据?
(这不是纯粹的学术性的,我实际上正在编写这些概念.)
更新:让我举个例子.我有一个字段"人",字段"年龄".如果我创建20个Person实例,则每个这样的实例都称为对象.到现在为止还挺好.但是,假设我选择Person"Igor",并将他的年龄设置为20.包含现在调用的数字20的存储位置是什么?它是一个领域,一个价值,还是其他什么?
另一个更新:Pavel Feldman在这个相关问题中的引用用不同的词语描述了我上面试图描述的内容:
"我会说在基于类的OOP字段属于类并且没有值.当你在c#或java中查看反射时,它是如此 - 类有字段,字段有类型,名称等等.你可以从对象中获取字段的值.在类中声明一次字段.你有许多具有相同字段但值不同的对象."
java ×5
jsf ×2
jsf-2 ×2
spring ×2
algorithm ×1
aspectj ×1
caching ×1
ehcache ×1
facelets ×1
haskell ×1
infinispan ×1
irc ×1
javascript ×1
jboss ×1
jmx ×1
join ×1
knockout.js ×1
mbeans ×1
mirc ×1
oop ×1
oracle ×1
reactjs ×1
spring-aop ×1
sql ×1
type-systems ×1