小编DGM*_*DGM的帖子

如何解决违反德米特法的行为?

我和一位同事为我们的客户设计了一个系统,我们认为我们创造了一个漂亮干净的设计.但是我遇到了一些我们引入的耦合问题.我可以尝试创建一个包含与我们的设计相同的问题的示例设计,但如果您原谅我,我将创建一个设计摘录来支持这个问题.

我们正在开发一种为患者注册某些治疗方案的系统.为了避免链接到图像,我将概念性UML类图描述为ac#样式类定义.

class Discipline {}
class ProtocolKind 
{ 
   Discipline; 
}
class Protocol
{
   ProtocolKind;
   ProtocolMedication; //1..*
}
class ProtocolMedication
{
   Medicine;
}
class Medicine
{
   AdministrationRoute;
}
class AdministrationRoute {}
Run Code Online (Sandbox Code Playgroud)

我将尝试解释一下设计,协议是新治疗的模板.并且协议属于某种类型并且具有需要施用的药物.根据协议,对于相同的药物(以及其他事物),剂量可以不同,因此存储在ProtocolMedication类中.AdministrationRoute是药物的管理方式,与协议管理分开创建/更新.

我发现以下地方违反了得墨忒耳法则:

违反了得墨忒耳法

在BLL里面

例如,在ProtocolMedication的业务逻辑中,存在依赖于药物的AdministrationRoute.Soluble属性的规则.代码将成为

if (!Medicine.AdministrationRoute.Soluble)
{
   //validate constrains on fields
}
Run Code Online (Sandbox Code Playgroud)

在存储库内

列出某个学科中所有协议的方法将写成:

public IQueryable<Protocol> ListQueryable(Discipline discipline)
{
    return ListQueryable().Where(p => (p.Kind.Discipline.Id == discipline.Id)); // Entity Frameworks needs you to compare the Id...
}
Run Code Online (Sandbox Code Playgroud)

在用户界面内

我们使用ASP.NET(没有MVC)作为我们系统的接口,在我看来这个层目前有最严重的违规行为.gridview的数据绑定(必须显示协议的Discipline的列必须绑定到Kind.Discipline.Name),这是字符串,因此没有编译时错误.

<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
   <ItemTemplate>
      <%# Eval("Kind.Discipline.Name")%>
   </ItemTemplate>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)

所以我认为实际的问题可能是,什么时候可以将其视为Demeter的建议,以及可以采取哪些措施来解决违反Demeter法的问题?

我对自己有一些想法,但我会将它们作为答案发布,以便他们可以单独评论和投票.(我不确定这是不是这样做的方法,如果没有,我会删除我的答案并将其添加到问题中).

language-agnostic design-patterns coupling law-of-demeter

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

通过get in rails传递参数数组

如何通过rails中的Get方法传递参数数组?目前我的网址是这样的:

http://localhost:3000/jobs/1017/editing_job_suites/1017/editing_member_jobs/new?ids[]=1025&ids[]=1027
Run Code Online (Sandbox Code Playgroud)

如何使用Get方法传递数组但避免使用?ids[]=1025&ids[]=1027.

使用javascript window.open方法发送请求.是否有任何解决方法发送不ajax Post请求.

ruby-on-rails http

36
推荐指数
3
解决办法
6万
查看次数

如何在Gitlab上调试电子邮件发送?

我的Gitlab(第5版)没有发送任何电子邮件,我迷失了,试图弄清楚发生了什么.日志没有提供有用的信息.我把它配置为使用sendmail.

我写了一个小脚本,通过ActionMailer发送电子邮件(我想这是gitlab用来发送电子邮件的,对吧?).它正确地发送电子邮件.

但是,在我的Gitlab上,我可以保证甚至不会调用sendmail.

我是否需要启用某些内容才能收到电子邮件通知?我该如何调试我的问题?

更新

问题是我无法在任何地方找到任何信息.事情就是默默地失败了.我在哪里可以找到某种日志?logdir中的日志不提供有用的信息.

我的问题是,如何使Gitlab更加冗长?我怎么能告诉我发生了什么?

更新2

我刚刚在该Background jobs部分发现了很多邮件.很多未经处理的Sidekiq::Extensions::DelayedMailer.这是什么意思?为什么这些工作没有得到处理?

ruby ruby-on-rails gitlab

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

在Access中以连续形式自定义组合框的行源

我一直在搜索,似乎这是MS Access的一个限制,所以我想知道其他人在这个难题中找到了哪些创意解决方案.

如果您有一个连续的表单,并且您希望某个字段是特定于该行的选项的组合框,则Access无法提供; 组合框行源仅在表单的开头查询一次,因此显示表单其余部分的错误选项.

当然,我们所有尝试的下一步是使用onCurrent事件来重新查询组合框,这实际上限制了给定行的选项.但是,在这一点上,Access变得疯狂,并且为每一行重新查询所有组合框,结果通常是消失并在其他行中重新出现选项,这取决于他们是否选择了对于该行有效的选项.当前记录的行来源.

我找到的唯一解决方案是始终列出所有可用选项.那里有创意答案吗?

编辑此外,我应该注意组合框的原因是将查询作为查找表,需要隐藏和存储实际值,同时显示人类可读的版本...组合框行中的多个列资源.因此,将限制更改为列表没有帮助,因为不在当前行源查询中的id将不具有匹配的人类可读部分.

在这种特殊情况下,连续形式很有意义,所以请不要告诉我这是错误的解决方案.我要求任何有创意的答案.

ms-access

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

Access中没有max(x,y)函数

VBA for Access缺少一个简单的Max(x,y)函数来查找两个或更多值的数学最大值.我习惯于在基础API中已经有来自其他语言的这样的函数,例如perl/php/ruby​​/python等.

我知道可以做到:IIf(x > y, x,y).还有其他解决方案吗?

ms-access vba max worksheet-function access-vba

13
推荐指数
1
解决办法
3万
查看次数

如何用Capybara在两帧之间切换

我尝试在2帧内做一些事情,但每当我尝试在帧之间切换时错误就会升高.例如:

# encoding: utf-8

require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'https://hb.posted.co.rs/posted'

class Account
  include Capybara::DSL

  def check_balance
    visit('/')
    page.driver.browser.switch_to.frame 'main'
    fill_in 'korisnik', :with => 'foo'
    fill_in 'lozinka', :with => 'bar'
    click_button 'Potvrda unosa'

    page.driver.browser.switch_to.frame 'header'
    click_on 'Stanje' 
  end
end

account = Account.new
account.check_balance
Run Code Online (Sandbox Code Playgroud)

错误是:

[远程服务器]文件:///tmp/webdriver-profile20120810-9163-xy6dtm/extensions/fxdriver@googlecode.com/components/driver_component.js:6638:在"未知"中:无法找到frame:main(Selenium :: webdriver的::错误:: NoSuchFrameError)

问题是什么?也许我在这里做错了什么?

如果我改变切换帧的顺序,那么首先尝试切换到'header'然后切换到'main'帧,然后相同的错误引发,除了它说这次没有'main'帧:

# encoding: utf-8

require "capybara/dsl"

Capybara.run_server = false
Capybara.current_driver = :selenium
Capybara.app_host = 'https://hb.posted.co.rs/posted'

class Account
  include Capybara::DSL

  def check_balance
    visit('/')
    page.driver.browser.switch_to.frame 'header'
    click_on 'Stanje' 

    page.driver.browser.switch_to.frame …
Run Code Online (Sandbox Code Playgroud)

ruby capybara

13
推荐指数
1
解决办法
1万
查看次数

Rails 3:将数组的所有元素相乘

假设我有一个数组A = [1,2,3,4,5]

如何将所有元素与ruby相乘并获得结果?1*2*3*4*5 = 120

如果有一个元素0怎么办?我怎么能忽略这个元素?

ruby

11
推荐指数
1
解决办法
1万
查看次数

如何找到应用程序的基本URL?

我想找到我的应用程序的基本URL,所以我可以自动引用我的应用程序树中的其他文件...

因此,在我的应用程序的基础上给出一个文件config.php,如果子目录中的文件包含它,知道在url前加上什么.

application/config.php
application/admin/something.php
application/css/style.css
Run Code Online (Sandbox Code Playgroud)

因此,http://www.example.com/application/admin/something.php如果访问它,我希望它能够知道css文件所在$approot/css/style.css.在这种情况下,$approot是" /application"但我想知道应用程序是否安装在别处.

我不确定是否可能,许多应用程序(我认为是phpMyAdmin,Squirrelmail)必须先设置一个配置变量.如果它只是知道它会更加用户友好.

php web-applications

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

使用rails迁移创建缺少的自动增量属性

我正在编写一个迁移,将非rails应用程序转换为rails的正确格式 - 由于某种原因,其中一个表没有在id列上设置自动增量.有没有一种快速的方法可以在迁移过程中打开它,可能还有change_column什么?

migration activerecord ruby-on-rails

9
推荐指数
3
解决办法
3763
查看次数

一个模型中有多个状态机?

我有一个代表注册过程的模型,需要跟踪几个过程的进展(背景检查,访谈,信息收集......).每个都可以由状态机表示,然后注册的总体状态可能取决于其他状态.

aasm可以处理这个吗?还有其他想法或设计考虑吗?

ruby-on-rails aasm

7
推荐指数
2
解决办法
1781
查看次数