小编Mik*_*378的帖子

桥模式 - Java编译的好处?

设计模式 - 可重用面向对象软件的元素书中说:

在只有一个实现(一对一)的情况下,创建一个抽象的实现者类是没有必要的.这是桥模式的退化情况; 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++?

你有什么看法?

java design-patterns bridge compilation

5
推荐指数
1
解决办法
544
查看次数

ECB模式 - 什么是真正的边界?

我刚看过Bob叔叔关于架构软件的演讲:

http://www.cleancoders.com/codecast/clean-code-episode-7/show

他谈到了ECB模式(实体 - 控制器 - 边界)

他坚持认为所有软件必须是主要的,尽管整个用例.

实际上,他重复了很多次关于工具,框架等的决定......必须推迟.

我对"边界"一词很感兴趣,所以我发现了这个解释:

http://process.osellus.com/sites/wiki/OpenUP%20DSDM/Wiki%20Pages/Guidance%20-%20Entity-Control-Boundary%20Pattern.aspx

在这里,我们看到边界与每个传递机制相关,如Web机制的形式(MarketingCampaignForm)等......

所以我的问题是:

boudaries必须知道将使用的交付机制的类型,并与Bob叔叔的观点相矛盾吗?

或者它们必须是简单的POJO代表简单的数据结构,它将在内部系统和交付机制之间共享; 并包含来自用户的输入和内部系统中控制器的输出?

java architecture design-patterns ecb-pattern

5
推荐指数
1
解决办法
4835
查看次数

比较组按 VS 过分区按

假设一张表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)

这两个查询的性能相似吗?

sql oracle database-performance

5
推荐指数
2
解决办法
2万
查看次数

当有意义的时候,我应该总是更喜欢成员变量而不是参数方法吗?

仅当值代表某个对象的状态时,将值作为字段才有意义。

我想知道在某些情况下是否应该避免这个“规则”。

这是一个例子,假设这个类:

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)

java oop jdbc

5
推荐指数
1
解决办法
263
查看次数

使用DDD的域服务和应用程序服务的命名约定

在DDD方法中,命名域服务组件和应用程序服务组件的最佳实践是什么?

例如,我应该在我的应用程序层中有一个名为RoomReservationService的服务,并且在我的域层中还有一个名为RoomReservationService的服务; 第一次委托给对方?

实际上,当一个应用程序服务没有收集很多域服务时,这意味着我找不到它们之间的不同名称,我如何命名它而不引起任何混淆?

java domain-driven-design naming-conventions

5
推荐指数
1
解决办法
1887
查看次数

SBT - 无法精确播放2应用程序的项目依赖性

我正在使用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)

scala jersey sbt playframework-2.0

5
推荐指数
1
解决办法
896
查看次数

AngularJs和登陆页面

登录页面通常与其他页面的外观完全不同.

基本上,具有角度的默认路由机制,index.html可以具有ng-view以便显示各种页面.
这个ng-view没有"条件"的概念.

确实,如果我想为所有页面指定一些导航栏但登陆页面会怎样?

我应该在每个模板中"包含"一个导航栏,打破DRY原则吗?

angularjs angular-ui-router

5
推荐指数
1
解决办法
7200
查看次数

在隔离范围内声明复杂对象

我创建了一个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.startscope.end不会影响指令范围.

我想宣布我的孤立范围,以便不会发生冲突:
scope.schedule.startscope.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(有效,我测试过)以保持良好的封装.

angularjs angularjs-directive angularjs-scope

5
推荐指数
1
解决办法
4394
查看次数

接口定义的关系术语

如果继承是用于实现is-a关系的OO技术,并且组合/聚合实现了一个has-a关系,那么Java/.NET样式接口实现的关系的适当名称是什么?

我真的热衷于术语can-do关系,因为这些接口通常用于指定支持的操作,如Sortable,Clonable等.此外,它听起来确实是肯定的.我想到的唯一一个我真正看过的名字是一个实现的关系,但它并没有真正描述这么多.

.net java oop terminology interface

5
推荐指数
1
解决办法
71
查看次数

如果我已经练习了基于示例的测试,为什么还要使用基于属性的测试?

一些开发人员在基于示例的测试中争论 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 …

testing tdd unit-testing property-based-testing

5
推荐指数
1
解决办法
1841
查看次数