标签: software-design

为什么Rails(3+)中仍然不支持存储过程?

我熟悉Ruby on Rails,DB(MS)驱动程序和存储过程之间长期以来爱恨交织的关系,我从版本2.3.2开始就开发了Rails应用程序.

然而,每隔一段时间出现一种情况,其中SP只是比(更慢)应用程序级别上的数据组合更好的选择.具体而言,运行组合来自多个表的数据的报告通常更适合SP.

为什么存储过程仍然很难集成到Rails或MySQL gem中.我目前正在开发一个使用Rails 3.0.10和MySQL2 gem 0.2.13的项目,但据我所知,即使最新的Edge Rails和MySQL gem 0.3+仍然在使用SP时发脾气.

过去和现在仍然存在的问题是在调用SP后数据库连接丢失.

>> ActiveRecord::Base.connection.execute("CALL stored_proc")
=> #<Mysql::Result:0x103429c90>
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync; 
[...]
>> ActiveRecord::Base.connection.active?
=> false
>> ActiveRecord::Base.connection.reconnect!
=> nil
>> ActiveRecord::Base.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1034102e0>
>> ActiveRecord::Base.connection.active?
=> false
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这是一个非常难以解决的问题,还是Rails的设计选择?

mysql stored-procedures ruby-on-rails software-design ruby-on-rails-3

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

解开Knuth的结:如何重组意大利面条代码?

这个问题的灵感来自如何将流程图转换为实现?它询问了从算法上消除goto代码语句的方法.科学论文描述了一般问题的答案.

我已经根据Knuth的算法X 的高级草图实现了一些代码.计算机编程的艺术描述了带有限制前缀词典排列的生成(参见本草案的第16页).

这是上述算法的相应流程图.

这可能是一个非常聪明且非常有效的算法,但代码的结构似乎很难遵循.我最终使用了良好的旧式goto实现:

//Algorithm X;
1:
initialize();
2:
enter_level(k);
3:
set(a[k],q);
if(test() == ok) {
  if (k == n) {
    visit();
    goto 6;
  }
  goto 4;
}
goto 5;
4:
increase(k);
goto 2;
5:
increasev2(a[k]);
if (q != 0) {
  goto 3;
}
6:
decrease(k);
if (k==0) {
  goto 7;
} …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm refactoring loops software-design

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

最小的API v.便利性

我正在尝试设计将在我的应用程序内部使用的接口.以Google为例,我努力减少公共API的混乱.但是,有一些便利方法是根据最小方法定义的.当我在方便和整洁之间寻求平衡时,我应该考虑哪些因素?

Google示例:in HashBiMap(doc):

为什么BiMap没有getKeyForValue()方法?

我们确实考虑过它(Doug Lea甚至半开玩笑地建议将其命名为teg()!).但你真的不需要它; 只需调用inverse().get().

Google Collections常见问题解答

Set接口上的一个例子:add()并且remove()是最小的方法,addAll()而且removeAll()是为了方便.addAll()可以实现add(),因此它并没有真正为客户提供使用的新功能Set.但它确实清理了客户端代码.

我考虑过制作一个Utility包含更多便利方法的课程.但是后来我离开了OOP,并且我必须在每次调用中包含被操作的对象作为参数.虽然我猜这是Java Collections类的例子.

java oop api-design interface software-design

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

为什么喜欢模板方法而非依赖注入?

我一直在阅读Gamma等人的Design Patterns.与依赖注入相比,我有一个关于模板方法的问题.

使用模板方法,您可以使用策略"模板化"类,这些策略提供所需操作或计算的替代方法.因此,不是从多个备选方案中选择一个策略并将该策略编码到类中,而是允许类的用户指定他们想要使用的备选方案.

这听起来对我来说非常合理.但我打了一个概念性的砖墙.

如果使用策略对象实例化类,则策略对象需要实现抽象接口.然后,程序员可以编写所有编译到类中的不同策略,而不会出现错误,因为策略实现了接口.使用策略的类将编码到策略接口而不是实现.

如果您要IPolicy为这些策略对象定义一个摘要,为什么不只是使用依赖注入并传入IPolicy构造?

任何人都可以解释为什么你更喜欢模板方法依赖注入?

c++ templates dependency-injection software-design

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

ATAM中实用树的目的

什么是实用树,以及在架构权衡分析方法(ATAM)的情况下它的用途是什么?

谢谢

architecture software-design

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

将业务逻辑放在实体中

我已经阅读了福勒关于" 贫血领域模型 " 的文章(链接:http://www.martinfowler.com/bliki/AnemicDomainModel.html),我同意他的观点.

我试图创建一个实体是简单POPO的应用程序,但是这样,我有一个胖服务层,而将一些逻辑放到实体中将是最简单的解决方案.

所以我会有这样的架构:

^
| Twig
| Controller | API
| Service
| Model
| Entity
Run Code Online (Sandbox Code Playgroud)

哪里:

实体:将是简单的POPO,只是一袋二传手和吸气剂

模型:将是用业务逻辑装饰的实体对象

服务:包含涉及多个实体的所有业务逻辑(这里我也会放置验证任务),并且像转换器实体一样 - >模型

控制器| API:只匹配Request with Service,ParamConvert并检查autorization

Twig:表示层

我的问题是如何将实体层隐藏到控制器并且仅适用于模型.为了用业务逻辑来装饰我的实体,我想构建一个使用存储库并装饰结果的服务(我找不到另一种方法来实现它).

所以,一个愚蠢的例子:

namespace ...\Entity\Article;
class Article {
    private $id;
    private $description;

    // getter and setter
}


namespace ...\Model\Article;
class Article {
    private $article; // all methods will be exposed in some way
    private $storeService; // all required services will be injected …
Run Code Online (Sandbox Code Playgroud)

php entity-framework software-design symfony doctrine-orm

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

软件设计与架构:如何将目录树中的数据与数据库同步

我现在扭头了一段时间,没有找到最终解决方案。因此,我希望我可以在架构层次上找到一些交流或帮助解决此问题。

我目前面临以下情况:我想编写一个Web应用程序(我使用Java编写,但是这与解决方案并没有真正的关系,因为目前这是一个更高层次的问题),在哪里关系类型:

Event --1:n--> Team --1:n--> Participant
Run Code Online (Sandbox Code Playgroud)

含义:我有一个活动,其中有许多团队,有很多参与者。到目前为止非常好-在SQL数据库中这将是一个简单的关系。

但是,还有一个目录树,在文件结构中表示相同的关系:

+--event1
|  +--team1
|  |  +--participant1
|  |  +--participant2
|  |  +--participant3
|  +--team2
|  |  +--participant4
|  +--team3
+--event2
|  +--team4
...
Run Code Online (Sandbox Code Playgroud)

(我想,您有主意)因此,每个参与者的目录中都有许多文件,这些文件通过文件系统复制到此目录中。只要文件系统上有目录,就应将其连接到数据库中的相应条目,该目录中有一些其他数据,应与Web GUI中的文件一起显示。它没有定义,首先是什么(数据库条目或目录),因为它是由不同的用户操作的。

现在有几件事要牢记,这对我来说很有意义:

  • 当目录名称更改(事件,团队或参与者)时,它仍应与数据库中的同一条目相关(因为可能存在其他实体,例如,这些实体仍与参与者相关)
  • 任何事件/团队/参与者的目录都可能被删除-然后数据库中的数据应保留。但是-如果以后再次创建一个具有相同名称的新目录,并且该事件被“关闭”,则该目录将指向一个新的数据库条目(例如,新事件)。如果事件仍处于活动状态,则具有相同名称的目录的创建应映射到数据库中先前分配的条目。
  • 理想情况下,目录的创建已经导致了相应数据库条目的创建。
  • 还应该有可能在Web GUI中创建事件/团队/参与者,然后在文件系统上自动创建相应的目录。

我希望我的描述足以理解情况。我已经有了一些想法,但是所有这些并没有真正说服自己成为一个可靠的解决方案。因此,希望你们中的一个已经对此有所了解。我对任何技术或框架都很开放,这可能有助于解决此问题。

我期待您的想法和愉快的讨论!

谢谢你的帮助!

architecture modeling software-design data-synchronization

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

如何在Android MVP中应用组合?

最近我接手了一个建立在MVP之上的android项目.虽然简单的屏幕非常简单,易于阅读和维护,但应用程序中更复杂的部分却不是.多个继承级别导致我在类之间切换几天,试图找出信息流实际上是如何工作的.

这里是一个更有问题的层次结构的例子:

遗产

由于我们使用MVP,因此图中的每个类自然会有另一个presenter类和另一个视图类.

所以我做了一些研究并发现了这篇文章: MVP中的组合与继承 ,它基本上说在这种情况下组合应该优于继承.不说的是如何在android中应用它.我想了一会儿,但不能想出一个漂亮的模式.我可以做自定义视图,但他们最终会如何使用演示者?

mvp android design-patterns software-design

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

标记界面与空抽象类

我在使用标记接口或空抽象类之间做出决定时遇到困难.

我有两个类BrokerResponseNotification,不具有结构相似性.连接它们的唯一方法是需要订阅.

void register(Receivable receivable, BrokerObserver observer)
Run Code Online (Sandbox Code Playgroud)

我不知何故不喜欢使用a Marker Interface,因为它违反了a 的基本定义Interface.另一方面,使用abstract super课程会让我感到不舒服,因为这两个课程彼此没有关系.

在这种情况下,通常更可取的方法是什么?为什么?

编辑1

我忘了提一下,这BrokerResponse是一个抽象类本身,它有几个子类来确定相应的类型.

java abstract-class software-design marker-interfaces

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

可插拔的跨平台软件设计,用于本机反应和本机反应

我想设计一个可跨平台(Android,iOS和Web)插件的软件,这意味着每个人都可以轻松地为其开发插件,并且用户可以从市场上选择插件并进行安装。每个插件都可以:

  • 与核心应用程序在后端共享数据
  • 在Apps和Web中拥有一个自定义UI,理想情况下,它使用标准UI-kit来保持一致性(例如Shopify polaris

在后端,在软件设计中有许多最佳实践,例如OAuth。但是在前端,问题并不简单:

  1. 是否有任何跨平台的UI-kit用于react和react-native?例如,使用Expo v33 +或ReactNativeWeb,我们可以为android / ios和web构建代码,但是我找不到任何跨平台的UI-kit。(NativeBaseElements或类似的跨平台UI- kit仅适用于Android和iOS)

  2. 在前端中,插件如何使用react和react-native(或理想情况下跨平台的UI套件)共享UI,以某种方式动态呈现在内核中(无需任何更新,例如,插件提供一个端点并返回一个react / native组件,核心将渲染它)

软件架构

architecture software-design reactjs react-native expo

8
推荐指数
1
解决办法
204
查看次数