在设计模式 - 可重用面向对象软件的元素书中说:
在只有一个实现(一对一)的情况下,创建一个抽象的实现者类是没有必要的.这是桥模式的退化情况; Abstraction和Implementor之间存在一对一的关系.然而,当类的实现中的更改不得影响其现有客户端时,这种分离仍然有用 - 即它们不应该被重新编译,只需重新链接.
我对编译时间的好处表示怀疑,因为我无法想象Java中的一个案例,即实现中的更改会重新编译其超类(在本例中为abstract).
例如,如果我们有X扩展Y并且客户端执行:
Y y = new X();
Run Code Online (Sandbox Code Playgroud)
X中的更改并不意味着重新编译Y(当然,如果我们不想更改X的方法签名)
使用Bridge Pattern时完全相同:
YAbstraction yabstraction = new YRefinedAbstraction(new XImplementor());
Run Code Online (Sandbox Code Playgroud)
XImplementor中的更改并不意味着重新编译YAbstraction.
因此,根据我的说法,这种好处不会发生在Java中,并且需要一对一=>无桥模式.
也许子类强制超类的更改要在其他语言中重新编译?喜欢SmallTalk和C++?
你有什么看法?
我刚看过Bob叔叔关于架构软件的演讲:
http://www.cleancoders.com/codecast/clean-code-episode-7/show
他谈到了ECB模式(实体 - 控制器 - 边界)
他坚持认为所有软件必须是主要的,尽管整个用例.
实际上,他重复了很多次关于工具,框架等的决定......必须推迟.
我对"边界"一词很感兴趣,所以我发现了这个解释:
在这里,我们看到边界与每个传递机制相关,如Web机制的形式(MarketingCampaignForm)等......
所以我的问题是:
boudaries必须知道将使用的交付机制的类型,并与Bob叔叔的观点相矛盾吗?
或者它们必须是简单的POJO代表简单的数据结构,它将在内部系统和交付机制之间共享; 并包含来自用户的输入和内部系统中控制器的输出?
假设一张表CAR有两列CAR_ID (int)和VERSION (int).
我想检索每辆车的最大版本。
所以有两种解决方案(至少):
select car_id, max(version) as max_version
from car
group by car_id;
Run Code Online (Sandbox Code Playgroud)
或者 :
select car_id, max_version
from ( select car_id, version
, max(version) over (partition by car_id) as max_version
from car
) max_ver
where max_ver.version = max_ver.max_version
Run Code Online (Sandbox Code Playgroud)
这两个查询的性能相似吗?
仅当值代表某个对象的状态时,将值作为字段才有意义。
我想知道在某些情况下是否应该避免这个“规则”。
这是一个例子,假设这个类:
public class DbCar {
private ResultSet rs;
public DbMapper(ResultSet rs) {
this.rs = rs;
}
public Car buildObject(){
//.....does some mappings, then returns the builded car ....
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我们看到 ResultSet 被存储为成员变量,这是有意义的,因为每个 DbMapper(如 DbCar)都操作从 JDBC 查询检索到的 ResultSet。
我们会有一个如下所示的调用者:
while (rs.next()) {
items.add(new DbCar(rs)).buildObject();
}
Run Code Online (Sandbox Code Playgroud)
但假设当前查询返回 15000 条记录。
简而言之 => 创建了 15000 个 DbCar 对象实例。
所以我的问题是:垃圾收集器是否足够高效,以便我不必担心如此大量的实例?
当然,为了避免所有这些情况,我们可以重构代码如下:
public class DbCar {
public Car buildObject(ResultSet rs) {
//.....does some mappings, then returns the builded car ....
}
} …Run Code Online (Sandbox Code Playgroud) 在DDD方法中,命名域服务组件和应用程序服务组件的最佳实践是什么?
例如,我应该在我的应用程序层中有一个名为RoomReservationService的服务,并且在我的域层中还有一个名为RoomReservationService的服务; 第一次委托给对方?
实际上,当一个应用程序服务没有收集很多域服务时,这意味着我找不到它们之间的不同名称,我如何命名它而不引起任何混淆?
我正在使用Scala作为主要语言创建一个play 2项目,因此需要在Scala中实现一个rest客户端.
不幸的是,我不能轻易使用已知的Java Jersey-Client.
我在github上找到了这个可能很棒的api:sjersey-client
使用SBT作为依赖管理工具,我尝试指示播放app对sjersey的依赖:
object ApplicationBuild extends Build {
val appName = "myWebapp"
val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq(
jdbc,
anorm
)
lazy val sjersey = RootProject(uri("git://github.com/FaKod/sjersey-client.git"))
val main = play.Project(appName, appVersion, appDependencies).dependsOn(sjersey).settings(
scalaVersion := "2.10.0"
)
}
Run Code Online (Sandbox Code Playgroud)
然后我运行命令:play reload update但更新失败:
[warn] Binary version (2.10) for dependency org.scala-lang#scala-library;2.10.0
[warn] in myWebapp#myWebapp_2.9.2;1.0-SNAPSHOT differs from Scala binary version in project (2.9.2).
[warn] module not found: play#play_2.9.2;2.1-RC1
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] :::::::::::::::::::::::::::::::::::::::::::::: …Run Code Online (Sandbox Code Playgroud) 登录页面通常与其他页面的外观完全不同.
基本上,具有角度的默认路由机制,index.html可以具有ng-view以便显示各种页面.
这个ng-view没有"条件"的概念.
确实,如果我想为所有页面指定一些导航栏但登陆页面会怎样?
我应该在每个模板中"包含"一个导航栏,打破DRY原则吗?
我创建了一个dateRangePicker我声明的指令:
<date-range-picker start="schedule.start" end="schedule.end"></date-range-picker>
Run Code Online (Sandbox Code Playgroud)
我的指令声明如下:
.directive("dateRangePicker", function () {
return {
restrict: 'E',
require: '^form',
scope: {
start: '=',
end: '='
},
replace: true,
templateUrl: 'dateRangePicker.tpl.html',
link: function (scope, elm, attrs, ctrl) {
Run Code Online (Sandbox Code Playgroud)
问题是我的模板:dateRangePicker.tpl.html初始化子范围(angular-ui的DatePicker组件通过其相应的控制器完成),因此任何尝试将值写入scope.start或scope.end不会影响指令范围.
我想宣布我的孤立范围,以便不会发生冲突:
scope.schedule.start和scope.schedule.end.
我试着这样做:
return {
restrict: 'E',
require: '^form',
scope: {
schedule: {
start: '=start',
end: '=end'
}
}
Run Code Online (Sandbox Code Playgroud)
但是会发生以下错误:
Error: 'undefined' is not a function (evaluating 'definition.match(LOCAL_REGEXP)')
有没有办法使用隔离范围实现它?
我只是不想传播范围scope:false(有效,我测试过)以保持良好的封装.
如果继承是用于实现is-a关系的OO技术,并且组合/聚合实现了一个has-a关系,那么Java/.NET样式接口实现的关系的适当名称是什么?
我真的热衷于术语can-do关系,因为这些接口通常用于指定支持的操作,如Sortable,Clonable等.此外,它听起来确实是肯定的.我想到的唯一一个我真正看过的名字是一个实现的关系,但它并没有真正描述这么多.
一些开发人员在基于示例的测试中争论 TDD 的一个警告是,可能缺乏所有有效的输入处理。
让我们举一个简单的例子,这些开发人员可能会争论:
编写一个将两个数字相加的程序。
Bob,开发人员开始编写第一个测试:
给定 1 + 3,那么结果是 4。
实现:def add(x: Int, y: Int) = 4
很好,通过了。
Now second test:
Given 2 + 2, then result is 4.
Implementation still the same: def add(x: Int, y: Int) = 4
So other developers would come and tell him:
"Now you see Bob that Example-based testing is not enough with your poor 2 examples !
You didn't test every output and looking at your actual implementation, it …
java ×5
angularjs ×2
oop ×2
.net ×1
architecture ×1
bridge ×1
compilation ×1
ecb-pattern ×1
interface ×1
jdbc ×1
jersey ×1
oracle ×1
sbt ×1
scala ×1
sql ×1
tdd ×1
terminology ×1
testing ×1
unit-testing ×1