小编Dav*_*uth的帖子

INTERPRETER是反模式吗?

对我来说,翻译模式听起来非常像一个被称为格林普森第十条规则的反模式:

任何足够复杂的C或Fortran程序都包含一个特殊的,非正式指定的,错误缠身的,一半Common Lisp的缓慢实现.

也就是说,如果你需要使用Interpreter,你可能会创建一些缓慢,临时和指定不当的东西.正确的解决方案是从一开始就使用正确的语言.

或者,或者,在您的应用程序中嵌入一个众所周知且语言清晰的语言,例如Guile(GNU可嵌入方案).或者使用Haskell作为嵌入式域特定语言.

但我在实践中没有看到这一点 - 您在构建自己的嵌入式语言方面有哪些经验?这是个好主意吗?它比嵌入已有的语言更好吗?

(我不是特别喜欢lisp的粉丝.这很好,但是C和Haskell以及python和很多其他语言都是如此.)

lisp design-patterns anti-patterns greenspunning interpreter-pattern

10
推荐指数
3
解决办法
1732
查看次数

在MVC中传统使用控制器是否会导致违反单一责任原则?

维基百科以这种方式描述单一责任原则:

单一责任原则规定每个对象应该只有一个责任,并且该责任应该由类完全封装.其所有服务应与该责任严格一致.

MVC中控制器的传统使用似乎导致程序员违反了这一原则.拿一个简单的留言簿控制器和视图.控制器可能有两个方法/操作:1)Index()和2)Submit().Index()显示表单.Submit()处理它.这两种方法是否代表两种不同的责任?如果是这样,单一责任如何进入?

model-view-controller single-responsibility-principle solid-principles

10
推荐指数
1
解决办法
1054
查看次数

访问者和模板化虚拟方法

访问者模式的典型实现中,类必须考虑基类的所有变体(后代).在许多情况下,访问者中的相同方法内容应用于不同的方法.在这种情况下,模板化的虚拟方法将是理想的,但目前,这是不允许的.

那么,可以使用模板化方法来解析父类的虚方法吗?

鉴于(基础):

struct Visitor_Base; // Forward declaration.

struct Base
{
  virtual accept_visitor(Visitor_Base& visitor) = 0;
};

// More forward declarations
struct Base_Int;
struct Base_Long;
struct Base_Short;
struct Base_UInt;
struct Base_ULong;
struct Base_UShort;

struct Visitor_Base
{
  virtual void operator()(Base_Int& b) = 0;
  virtual void operator()(Base_Long& b) = 0;
  virtual void operator()(Base_Short& b) = 0;
  virtual void operator()(Base_UInt& b) = 0;
  virtual void operator()(Base_ULong& b) = 0;
  virtual void operator()(Base_UShort& b) = 0;
};

struct Base_Int : public Base …
Run Code Online (Sandbox Code Playgroud)

c++ templates virtual-functions operator-overloading visitor

10
推荐指数
1
解决办法
1927
查看次数

基于组件的游戏引擎设计中的事件处理

我想这个问题或它的变化会传递很多,所以如果我说的是重复的,答案在其他地方,请通知我.

我一直在研究游戏引擎设计,并且遇到了基于组件的实体模型.这听起来很有希望,但我仍在努力实施它.

我正在考虑一个系统,其中引擎安排了几个"子系统",它管理一些方面,如渲染,声音,健康,AI等.每个子系统都有一个与之关联的组件类型,就像健康的健康组件子系统."实体",例如NPC,门,某些视觉效果或播放器,简单地由一个或多个组件组成,这些组件一起为实体提供其功能.

我确定了四个主要的信息传递渠道:一个组件可以广播到其当前实体中的所有组件,一个组件可以广播到其子系统,一个子系统可以广播到其组件,一个子系统可以广播到其他子系统.

例如,如果用户想要移动他们的角色,他们会按一个键.此按键将由输入子系统拾取,然后输入子系统广播该事件并由播放器子系统拾取.然后,播放器子系统将此事件发送给所有播放器组件(以及这些组件组成的实体),并且这些播放器组件将与其自己的实体的位置组件通信以继续并移动.

所有这一切对于一个关键的新闻似乎有点啰嗦,我当然愿意改进这种架构.但无论如何,我的主要问题仍然存在.

至于事件本身,我考虑了事件在访客模式中的行为.我想要的重要性是,如果一个事件遇到它不支持的组件(因为在移动事件中没有与AI或健康直接相关),它将忽略该组件.如果一个事件没有找到它正在追踪的组件,那就没关系了.

访客模式几乎可行.但是,它需要我为每种类型的组件(即visitHealthComponent,visitPositionComponent等)提供虚函数,即使它与它们没有任何关系.我可以将这些函数留空(所以如果遇到这些函数,它会被忽略),但每次添加一个组件时我都要添加另一个函数.

我希望能够添加一个组件而不必将东西添加到其他地方,并添加一个事件而不会弄乱其他东西.

那么,我的两个问题:

  1. 在效率,灵活性等方面,我的设计是否可以改进?
  2. 处理事件的最佳方式是什么?

oop components visitor game-engine

10
推荐指数
1
解决办法
5266
查看次数

在Composite结构上使用Interpreter模式

我被要求使用Composite,Recursive Descendent ParserInterpreter创建表达式求值程序.

这是语法:

<cond> ? <termb> [OR <termb>]*
<termb>?<factb>[AND <factb>]*
<factb>?<expr> RELOP <expr> | NOT <factb> | OPAR <cond> CPAR
<expr> ? [PLUS | MINUS] <term> [(PLUS <term>) | (MINUS <term>)]*
<term> ? <termp> [(MULT <termp>) | (DIV <termp>) | (REM <termp>)]*
<termp> ? <fact> [POWER <fact>]*
<fact> ? ID | NUM | OPAR1 <expr> CPAR1
----TERMINALS----
ID ? ("A" | ... | "Z" | "a" | ...| "z") …
Run Code Online (Sandbox Code Playgroud)

java design-patterns composite interpreter-pattern

10
推荐指数
1
解决办法
2226
查看次数

Rspec嘲讽,可以'期待'还会将方法作为副作用吗?

我试图理解继承应用程序中的测试,我需要一些帮助.

有很多像这样的规范组(视图规范):

let(:job_post) { FactoryGirl.create(:job_post) }

# ...

before do
  expect(view).to receive(:job_post).at_least(:once).and_return(job_post)
end

it "should render without error" do
  render
end
Run Code Online (Sandbox Code Playgroud)

... job_post作为控制器上定义的辅助方法.(是的,他们本可以使用@instance变量,而我正在重构它).

现在,在我看来,使用expect内部before块是错误的.让我们暂时忘掉这一点.

通常上面的测试是绿色的.
但是,如果我删除expect行,则测试失败.在这种情况下似乎是在expect视图上存根方法.事实上,替换expectallow似乎有完全一样的效果.

我认为正在发生的事情通常是 - 当与服务器一起运行时 - 视图将调用job_posts并且消息将落在控制器上的辅助方法上,这是预期的行为.

然而,在这里,expect设定一个期望,同时,view用固定的返回值来固定方法.由于视图模板调用该方法,因此测试通过.

关于那个意外的"存根"副作用expect,我在rspec-mocks自述文件中发现了这个:

(...)我们还可以设置消息期望,以便在未调用find时示例失败:

person = double("person")
expect(Person).to receive(:find) { person }
Run Code Online (Sandbox Code Playgroud)

RSpec 用它自己的类似测试的方法取代了我们使用它进行存根或模拟的方法.在示例的最后,RSpec验证任何消息期望,然后恢复原始方法.

有没有人对这种方法的具体使用有任何经验?

ruby rspec ruby-on-rails rspec-mocks

10
推荐指数
1
解决办法
7403
查看次数

如何持久化实现状态模式的对象?

我是状态设计模式的新手,我找不到将对象的不同状态保存到数据库的正确示例(在我的例子中是SQL Server).该场景与下一篇文章中描述的示例非常相似[几乎相同],但是我没有找到将状态持久保存到数据库的适用解决方案.你们可以推荐一个链接或者可能举个例子吗?

C#中的状态模式用法和示例

另外:如何在运行时枚举所有不同的ConcreteState类型?举例来说,如果你有10个不同的国家,你声明与10个不同成员的EnumStates,并给每一个成员的ConcreteState关联EnumStates成员,或者你通过得到的ConcreteState的子类得到所有的不同的状态?

为了您的信息,我需要能够根据不同的状态搜索实体.

c# state design-patterns software-design state-machine

10
推荐指数
2
解决办法
4323
查看次数

Rails + Capybara + poltergeist ArgumentError:rack-test需要一个机架应用程序,但没有给出

我刚刚开始玩Capycabra + poltergeist,执行我的Capy测试rspec ./spec/features/test_spec.rb 后出现以下错误:

 Failure/Error: visit '/item/new'
 ArgumentError: rack-test requires a rack application, but none was given
Run Code Online (Sandbox Code Playgroud)

此外,我有一些标准的rspec测试,每当我尝试执行所有测试时,rspec测试成功通过,但只有capy测试失败并出现奇怪的错误

ActionView::Template::Error: couldn't find file 'jquery.min' (in app/assets/javascripts/application.js:13)
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑.

我在stackoverflow上查看了几个类似的线程,在某些情况下,错误是缺少config.include specyhel.rb中的Capybara :: DSL或测试的错误位置.我做了相应的更改,但它不起作用,错误仍然是相同的.

我的spec_helper.rb文件

require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

Capybara.javascript_driver = :poltergeist

RSpec.configure do |config|
  config.include Capybara::DSL
end
Run Code Online (Sandbox Code Playgroud)

完整版spec_helper:http://pastebin.com/qkANfu39

测试文件:

#spec/features/test_spec.rb

require 'spec_helper'
describe 'accessibility of webpage' do
  it 'should access web page' do
    visit '/item/new'
    expect(page).to have_content("Something")
  end

end
Run Code Online (Sandbox Code Playgroud)

思考?

rspec ruby-on-rails capybara phantomjs ruby-on-rails-4

10
推荐指数
1
解决办法
6536
查看次数

分层模型 - 视图 - 控制器(HMVC)的示例?

我对Presentation-Abstraction-Control很感兴趣?(又名Hierarchical-Model-View-Controller(HMVC))用于构建复杂用户界面(GUI或Web)的架构模式,并且想知道是否有人知道我可以阅读代码的野外任何示例?

我知道在Presentation-Abstraction-Control维基百科文章中引用的JavaWorld文章和相关字母.

model-view-controller user-interface design-patterns

9
推荐指数
1
解决办法
9696
查看次数

如何在Factory Girl或Minifacture中使用随机唯一数据制作Ruby测试工厂?

我正在使用典型工厂测试典型的Rails模型:

# My model uses a 3-letter uppercase airport code,
# such as "ATL" for Atlanta, "BOS" for Boston, etc.

class Airport < ActiveRecord::Base
  validates :code, uniqueness: true

Factory.define :airport do |f|
  f.code { random_airport_code }  # Get a 3-letter uppercase code
Run Code Online (Sandbox Code Playgroud)

我正在添加更多测试并开始在机场代码中看到碰撞:例如工厂创建一个代码为"XYZ"的机场,然后工厂的后续调用尝试创建具有相同代码的机场.

序列是解决这个问题的一种方法.例如,使用Factory Girl序列,有序列表或预先计算的枚举,一些类似的方式来维护下一个可用代码的状态.

我的问题是:什么是非序列方法来解决这个问题?我想使用随机数据,而不是序列.

我正在尝试的一些想法因为它们是务实的 - 对这些的任何见解都非常感激.

使用乐观锁定的示例构思

while 
  airport = Factory.build :airport
  airport.save && return airport
end
Run Code Online (Sandbox Code Playgroud)

优点:实践快速,因为碰撞很少见; 当地的州.

缺点:笨拙的语法; 非本地工厂; 由于碰撞以外的原因,保存可能会失败.

使用事务的示例构思

Airport.transaction 
  while
    x = random_airport_code
    if Airport.exists?(code: x)
      next
    else
      Factory :airport, …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails minitest factory-bot

9
推荐指数
2
解决办法
1707
查看次数