我熟悉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
这个问题的灵感来自如何将流程图转换为实现?它询问了从算法上消除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) 我正在尝试设计将在我的应用程序内部使用的接口.以Google为例,我努力减少公共API的混乱.但是,有一些便利方法是根据最小方法定义的.当我在方便和整洁之间寻求平衡时,我应该考虑哪些因素?
Google示例:in HashBiMap(doc):
为什么BiMap没有getKeyForValue()方法?
我们确实考虑过它(Doug Lea甚至半开玩笑地建议将其命名为teg()!).但你真的不需要它; 只需调用inverse().get().
Set接口上的一个例子:add()并且remove()是最小的方法,addAll()而且removeAll()是为了方便.addAll()可以实现add(),因此它并没有真正为客户提供使用的新功能Set.但它确实清理了客户端代码.
我考虑过制作一个Utility包含更多便利方法的课程.但是后来我离开了OOP,并且我必须在每次调用中包含被操作的对象作为参数.虽然我猜这是Java Collections类的例子.
我一直在阅读Gamma等人的Design Patterns.与依赖注入相比,我有一个关于模板方法的问题.
使用模板方法,您可以使用策略"模板化"类,这些策略提供所需操作或计算的替代方法.因此,不是从多个备选方案中选择一个策略并将该策略编码到类中,而是允许类的用户指定他们想要使用的备选方案.
这听起来对我来说非常合理.但我打了一个概念性的砖墙.
如果使用策略对象实例化类,则策略对象需要实现抽象接口.然后,程序员可以编写所有编译到类中的不同策略,而不会出现错误,因为策略实现了接口.使用策略的类将编码到策略接口而不是实现.
如果您要IPolicy为这些策略对象定义一个摘要,为什么不只是使用依赖注入并传入IPolicy构造?
任何人都可以解释为什么你更喜欢模板方法依赖注入?
我已经阅读了福勒关于" 贫血领域模型 " 的文章(链接: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) 我现在扭头了一段时间,没有找到最终解决方案。因此,我希望我可以在架构层次上找到一些交流或帮助解决此问题。
我目前面临以下情况:我想编写一个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中的文件一起显示。它没有定义,首先是什么(数据库条目或目录),因为它是由不同的用户操作的。
现在有几件事要牢记,这对我来说很有意义:
我希望我的描述足以理解情况。我已经有了一些想法,但是所有这些并没有真正说服自己成为一个可靠的解决方案。因此,希望你们中的一个已经对此有所了解。我对任何技术或框架都很开放,这可能有助于解决此问题。
我期待您的想法和愉快的讨论!
谢谢你的帮助!
最近我接手了一个建立在MVP之上的android项目.虽然简单的屏幕非常简单,易于阅读和维护,但应用程序中更复杂的部分却不是.多个继承级别导致我在类之间切换几天,试图找出信息流实际上是如何工作的.
这里是一个更有问题的层次结构的例子:
由于我们使用MVP,因此图中的每个类自然会有另一个presenter类和另一个视图类.
所以我做了一些研究并发现了这篇文章: MVP中的组合与继承 ,它基本上说在这种情况下组合应该优于继承.不说的是如何在android中应用它.我想了一会儿,但不能想出一个漂亮的模式.我可以做自定义视图,但他们最终会如何使用演示者?
我在使用标记接口或空抽象类之间做出决定时遇到困难.
我有两个类BrokerResponse和Notification,不具有结构相似性.连接它们的唯一方法是需要订阅.
void register(Receivable receivable, BrokerObserver observer)
Run Code Online (Sandbox Code Playgroud)
我不知何故不喜欢使用a Marker Interface,因为它违反了a 的基本定义Interface.另一方面,使用abstract super课程会让我感到不舒服,因为这两个课程彼此没有关系.
在这种情况下,通常更可取的方法是什么?为什么?
我忘了提一下,这BrokerResponse是一个抽象类本身,它有几个子类来确定相应的类型.
我想设计一个可跨平台(Android,iOS和Web)插件的软件,这意味着每个人都可以轻松地为其开发插件,并且用户可以从市场上选择插件并进行安装。每个插件都可以:
在后端,在软件设计中有许多最佳实践,例如OAuth。但是在前端,问题并不简单:
是否有任何跨平台的UI-kit用于react和react-native?例如,使用Expo v33 +或ReactNativeWeb,我们可以为android / ios和web构建代码,但是我找不到任何跨平台的UI-kit。(NativeBase,Elements或类似的跨平台UI- kit仅适用于Android和iOS)
在前端中,插件如何使用react和react-native(或理想情况下跨平台的UI套件)共享UI,以某种方式动态呈现在内核中(无需任何更新,例如,插件提供一个端点并返回一个react / native组件,核心将渲染它)
software-design ×10
architecture ×3
c++ ×2
java ×2
algorithm ×1
android ×1
api-design ×1
doctrine-orm ×1
expo ×1
interface ×1
loops ×1
modeling ×1
mvp ×1
mysql ×1
oop ×1
php ×1
react-native ×1
reactjs ×1
refactoring ×1
symfony ×1
templates ×1