标签: software-design

专门针对软件架构而非软件设计的书籍

您能否请一些关于软件架构的书籍,它应该讨论如何在模块级别设计软件以及这些模块如何交互.有很多书谈论设计模式,这些模式大多是低级细节.我知道低级细节也很重要,但我想要一份好的设计架构书.

还请提出一些讨论软件架构案例研究的书籍.

uml design-patterns software-design

12
推荐指数
2
解决办法
2428
查看次数

架构:操纵模型而不污染POJO的最佳实践?并且无需在任何地方重复锅炉板代码

这是我们经常遇到的问题.必须有一些最佳实践来解决这个问题......

简化问题

放置操作POJO的通用代码的最佳位置在哪里?

这样:

  • POJO只有属性和getter/setter
  • 相同的模型操作代码不会重复"无处不在"
  • 这是清楚哪些类是负责操纵模型

背景

我们有一个定义我们域的模式.从那时起,我们生成一个"纯"模型,它由来自JAXB的简单对象(PO​​JO)组成.

在使用此模型时,团队中的几位开发人员已创建了用于访问和操作模型的样板代码.它在许多地方"撒了".有些人创建了包装器对象,它们继承了模型的实例并添加了功能.其他人创建了外部实用程序类.我正在寻求统一这个代码,以便它不再"洒在各处". 理想情况下,逻辑可以包含在某类对象中,这些对象明确负责模型的通用操作.

我们使用杂货店作为一般例子.模型对象包括以下内容:
Products, Aisle, Shelf, Employee, WorkSchedule, Vendor

常见的模型操作包括以下内容:
findManagerWorkingOnDay(day, schedule), findAisleForProduct(apples), countItemsOnShelf(topShelf), product.isModified(), removeProductFromVendor(apples, vendor)

我们不希望用类似的功能"污染"我们的供应商POJO removeProductFromVendor.同样,我们不一定要扩展每个模型对象,只是添加isModified属性,这样我们的GUI就可以知道"启用/禁用"保存按钮.

或者我们呢?

摘要

一旦模型对象在内存中,谁应该负责操纵它 - 例如,迭代一个"今天值班的员工"列表,并找到一个谁是"经理?"

在这些情况下,数据库调用过度,因为我们已经在内存中拥有了所需的一切(例如:我们已经查询过DataStore,我们需要在整个应用程序中使用结果对象). 理想情况下,此代码可供具有(例如)员工列表的任何对象使用.


在最佳实践方面,放置静态方法的理想位置在哪里:
public static Employee findManager(List<Employee> employeesOnDuty);

这将迭代员工列表(POJO)并返回第一个在哪里 employee.title.toLowerCase().contains("manager")

如果一个团队使用这个样本对象模型,几个人会编写这样的函数.有哪些最佳实践可以捕捉到这一责任,使POJO保持"纯粹",并且相同的锅炉板代码不会"洒在任何地方".

java architecture design-patterns software-design

12
推荐指数
2
解决办法
2633
查看次数

DDD通过复合身份导航到聚合根内的实体

我有一个聚合根Products,其中包含一个实体列表Selection,这些实体又包含一个被调用的实体列表Features.

  • 聚合根Product具有名称的标识
  • 该实体Selection具有名称标识(及其相应的产品标识)
  • 该实体Feature具有名称标识(以及它的相应选择标识)

实体的身份构建如下:

var productId = new ProductId("dedisvr");
var selectionId = new SelectionId("os",productId);
var featureId = new FeatureId("windowsstd",selectionId);
Run Code Online (Sandbox Code Playgroud)

请注意,从属标识将父标识作为组合的一部分.

这个想法是,这将形成产品部件号,可以通过选择中的特定特征来识别,即ToString()上述featureId对象将返回dedisvr-os-windowsstd.

所有内容都存在于Product聚合中,其中使用业务逻辑来强制选择和功能之间的关系不变.在我的域中,没有选择而没有相关产品的选择存在功能是没有意义的.

在查询产品以查找关联功能时,将返回Feature对象,但C#internal关键字用于隐藏任何可能使实体变异的方法,从而确保实体对调用应用程序服务不可变(在与域代码不同的程序集中) .

上述两个断言由两个函数提供:

class Product
{
    /* snip a load of other code */

    public void AddFeature(FeatureIdentity identity, string description, string specification, Prices prices)
    {
       // snip...
    }

    public IEnumerable<Feature> GetFeaturesMemberOf(SelectionIdentity identity);
    {
       // snip...
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个称为服务订单,这将包含一个ConfigurationLine其将引用聚合根Feature …

entities domain-driven-design software-design aggregateroot

12
推荐指数
2
解决办法
5665
查看次数

清洁架构 - 罗伯特马丁 - 如何连接用例

我正在尝试实施Robert Martin描述的清洁架构.更具体地说,我正在使用VIPER,这是一个iOS版本的Clean Architecture.

我遇到的问题如下:

用户开始查看带有位置(引脚)的地图.如果他点击一个按钮,则会丢弃一个引脚并将其带到另一个视图以创建(或编辑,如果它是对现有引脚的点击)该地点(或取消).在另一个视图中,用户可以编辑地点的信息,然后单击"返回"或"完成"(或"编辑").如果他单击"完成",PlaceDetailsViewController将向PlaceDetailsPresenter发送一条消息,其中包含位置信息,PlaceDetailsPresenter使用CreatePlaceInteractor创建该位置.此交互器返回用于标识场所的GUID.

如果用户在创建场所之前点击回来,他会回到地图并且掉落的针脚会上升和离开(因为它没有GUID,它是一个新的位置并消失).如果他在创建后单击后退,则引脚会保留在那里(因为它应该有一个GUID).

我该如何连接所有这些以及应该存储地点信息(包括GUID)的位置?澄清一点:

  1. 谁应该通知MapPresenter针脚留在那里还是消失?它是PlaceDetailsPresenter还是应该将此信息传递给PlaceDetailsWireframe - > MapWireframe - > MapPresenter - > MapView?
  2. 在返回之前,应该在PlaceDetailsPresenter或PlaceDetailsViewController中存储此GUID的位置?

现在,这就是我所拥有的: 在此输入图像描述

编辑:

基本上我认为问题在于VIPER来自罗伯特·马丁的清洁架构而且他来自Web(Rails)背景,所以他对状态没有太多考虑(或者在他的会谈中没有详细说明).

这主要是我的问题,应该在哪里存储状态,不同模块应该如何通信,如果是通过线框,或通过数据库,或通过交互者,或通过演示者彼此通信,如https:/ /github.com/objcio/issue-13-viper-swift.

architecture software-design ios

12
推荐指数
1
解决办法
4237
查看次数

Django式框架模式

我一直在使用Django多年(自Django 1.2以来).在过去,我使用了不同类型的Web框架(例如CakePHP,Rails,ASP.NET MVC和其他一些全栈框架).Django不是我的第一个框架.

不同的框架在方法和利益上存在差异.我喜欢这些框架的某些部分,但我不喜欢.在这种情况下,我想更具体地看一下Django Framework的设计.

在转换到Django之后,我喜欢它如何设计它的框架.在学习一门新语言(如Go,Scala,Ruby,Haskell)时,我试图寻找一个在设计上有一些相似性的框架,特别是我后面提到的那些框架.

以下是2个Django框架设计决策的不同之处:

我不相信Django先锋这样的功能.我相信这种模式在框架设计中非常普遍.只是我不知道,这个(设计)模式叫什么?这个概念在其他框架中应用非常有用.我相信知道模式的名称可以帮助我理解甚至用相同的概念构建不同语言的新框架.

目前有大量的Web框架,其中大多数都遵循经典的MVC模式.有些人使用插件的概念来添加某些功能.然而,插件根据上下文解决了不同方法的可重用性.

所以我确实尝试了尽可能多的框架,以便找到不同语言的替代框架.希望我能找到Django使用的模式.但是,我很难学到所有这些.事实上,到目前为止我还没有找到一个.

我一直在寻找:

不幸的是,它们都没有真正突出我感兴趣的概念.

在这个Q&A中,我想知道人们称之为这样的框架是什么?(或者Django使用什么模式?)如果你能在这个设计中给出一个其他框架可能也在使用它的参考文件,那会不错?

django frameworks design-patterns web-frameworks software-design

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

如何设计软件工作流程图?

我已经工作了一段时间,但由于我早先的习惯,我从未系统地工作过.

从来没有为我的软件创建一个工作流程图,因为软件将如何工作,而不是我直接开始工作,这反过来会导致很多问题.


以下是我目前需要帮助的一个小情况: -

注意:我已经创建了一个软件,它执行以下操作,我不需要任何代码,我只想知道如何为这种情况创建工作流程图.

1)聚会清单:这是我想存储客户的所有信息的地方.

在此输入图像描述

2)销售:在这里,我将向客户出售我的产品.

这里有2个案例,每当客户到达时,我们都可以选择

  • 将其保存在聚会列表中,然后从销售表单的列表中选择它

在此输入图像描述

  • 或手动输入然后保存

在此输入图像描述

现在来看检查部分: -

如果勾选复选框并且用户选择了一方时,如果某个条目已保存在销售中,则说" Akhmed "已保存,并且用户尝试从" 聚会列表"表单中删除" Akhmed " 的记录,则软件不应该允许它这样做,因为" Akhmed " 的条目已经存在于Sales中.


谁能告诉我如何为这种情况创建工作流程图?

编辑

以下是我阅读一些文章后所做的示例工作流程,请指出可以对其进行的任何改进,或者是完全错误还是其他任何内容.

在此输入图像描述

algorithm workflow logic software-design

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

什么是解决相互作用的组合爆炸的最佳方法?

我现在正在做的事情之一与游戏有一些相似之处.出于说明的目的,我将使用从虚构的假设游戏中抽取的示例来解释我的问题.

我们称之为DeathBlaster 4:The Deathening.在DB4中,您有许多Ship对象Phenomena在旅行时会定期和随机地遇到.一个给定的Phenomenon可能EffectsShip遇到它时有零个,一个或多个.例如,我们可能有四种Ships和三种Phenomena.

                              Phenomena
              ==========================================
Ships         GravityWell     BlackHole      NebulaField
------------  ------------------------------------------
RedShip       +20% speed      -50% power     -50% shield
BlueShip      no effect       invulnerable   death              Effects of Various
GreenShip     -20% speed      death          +50% shield        Phenomena on Ships
YellowShip    death           +50% power     no effect    

另外,Effects可以彼此交互.例如,GreenShip这是在两者GravityWell和一个NebulaField可导出某种所生成之间的协同作用的SpeedEffectShieldEffect.在这种情况下,协同效应本身就是Effect- 例如,可能存在PowerLevelSynergyEffect这种相互作用的结果.除了Effects在a 上采取行动之外,不需要任何其他信息Ship …

c# design-patterns software-design

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

为什么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
查看次数

CoreBluetooth:如何为许多特性设计代码(30 - 40)?

我搜索了一下,发现这可能是一个重复的问题:

多个CBPeripheral用于同一设备

我的问题是:

我有多个服务,它们共有大约30-40个特征(是的,我需要所有这些...).作为处理CoreBluetooth的起点,我总是使用Apple示例代码(CoreBluetooth温度传感器).

发现和服务/特征处理分为两类,这只适用于几个特征.但是在一个类中处理这么多的特性并不是我在"良好的软件设计"中所理解的.

进入脑海的第一个想法是为每个服务创建一个类.但不幸的是,CBPeripheral只能同时拥有一个CBPeripheralDelegate.这意味着我不能把它分成几个类.

(如果BLE是获取此类数据的正确技术,我们不必开始讨论 - 事实并非如此.但是有些制造商使用BLE,因此他们不必为MFi计划烦恼......)

我还阅读了最终提供的CoreBluetooth编程指南,但它只描述了基本的工作流程 - 没有关于正确的设计.

我正在寻找一个很好的设计方法.您可能有任何建议,提示或示例代码链接?提前谢谢了!

architecture software-design ios core-bluetooth cbperipheral

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

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

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

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

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

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

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

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