我正在从 Robert C. Martin 的《Clean Architecture》一书中学习建筑。本书强调的主要规则之一是 DIP 规则,该规则规定源代码依赖项必须仅指向内部,指向更高级别的策略。尝试将其翻译到嵌入式领域假设 2 个组件scheduler和timer. 调度程序是高级策略,它依赖于低级计时器驱动程序,需要调用 API get_current_time(),set_timeout()我只需将模块拆分为一个实现文件timer.c和一个标头(一个接口?)timer.h,并且scheduler.c可以简单地包含timer.h使用这些 API 。读这本书将前面的场景描述为违反了依赖关系规则,并暗示应该实现两个组件之间的接口来打破依赖关系。
例如,要模仿 c 中的情况,timer_abstract可以包含带有函数指针的通用结构
struct timer_drv {
uint32 (*get_current_time)(void);
void (*set_timeout)(uint32 t);
}
对我来说,这看起来像是过度设计。一个简单的头文件还不够吗?C 头文件可以被视为接口吗?
无标签最终模式让我们可以编写纯函数式程序,这些程序明确说明了它们所需的效果。
然而,扩展这种模式可能会变得具有挑战性。我将尝试用一个例子来证明这一点。想象一个简单的程序,它从数据库读取记录并将其打印到控制台。除了 cats/scalaz 之外,我们还需要一些自定义类型类Database和来组合它们:ConsoleMonad
def main[F[_]: Monad: Console: Database]: F[Unit] =
read[F].flatMap(Console[F].print)
def read[F[_]: Functor: Database]: F[List[String]] =
Database[F].read.map(_.map(recordToString))
Run Code Online (Sandbox Code Playgroud)
当我想在内层的函数中添加新的效果时,问题就开始了。例如,我希望我的read函数在未找到记录时记录一条消息
def read[F[_]: Monad: Database: Logger]: F[List[String]] =
Database[F].read.flatMap {
case Nil => Logger[F].log("no records found") *> Nil.pure
case records => records.map(recordToString).pure
}
Run Code Online (Sandbox Code Playgroud)
但现在,我必须向链上游Logger的所有调用者添加约束。read在这个人为的示例中,它只是main,但想象一下这是一个复杂的现实应用程序的几个层。
我们可以从两个方面来看待这个问题:
main不关心日志记录,它只需要read. 此外,在实际应用中,您会在顶层看到很长的效果链。感觉像是代码味道,但我无法确定我还可以采取什么其他方法。很想了解您对此的见解。
谢谢。
我有两个已检查的异常:TestException1和TestException2以及以下代码:
void p1() throws TestException1{
p2();
}
void p2() throws TestException1 {
p3();
}
void p3() throws TestException1 {}
Run Code Online (Sandbox Code Playgroud)
对p3的签名进行如下编辑是否违反了开闭原则?
void p3() throws TestException1, TestException2 {}
Run Code Online (Sandbox Code Playgroud) 我们正在构建类似于 Messenger 的聊天应用程序。有必需的行为:
我的解决方案:
我应该处理的可能问题:
如果有一些优雅的方法来处理这种情况,你能给我建议吗?谢谢。
我几年来一直是一名自学成才的Web开发人员,通常使用C#/ ASP.NET,Python和PHP.但是我想通过做一些更先进的事情来提高我的技能.我希望尝试构建像SQLite这样的数据库程序,或者只是为了练习和学习新东西而在C/C++中构建一个迷你MySQL类的东西.
编辑: 我的项目不一定是RDBMS.它可以是简单的Web服务器之类的东西.如果我喜欢做那种比Web开发更多的东西,那就好了.
但是,我似乎无法在网上找到任何类型的书或教程来教授这类事情.有谁知道我在哪里可以找到有关此的资源?我有一本教授语言本身的C书,但是当我尝试构建像数据库引擎等特定的东西时,我学会了如何更好地思考问题.感谢任何输入.
There are many components in one ZF2 system. Each component has its own presentation layer, business layer, and data layer. The problem is when component Foo has a Controller which uses component Bar's data layer.
example:
<inside modules, each module can be individually deployed or removed>
\modules
\Foo ; one module (this directory) can be added or removed
\view ; presentation layer (view) for all subcomponents
\Subcomponent1
\Action1
\Subcomponent2
\Action2
...
\src
\Subcomponent1
\Entity ; data layer (model)
\Controller ; …Run Code Online (Sandbox Code Playgroud) 在Java中使用嵌套类有什么好处?在许多示例中,在我看来它只会增加设计的复杂性.是否有任何示例显示使用嵌套类与复合模式进行比较的能力?
简介: 我们正在重新设计我们的应用程序架构,我们即将制定导入设计决策.
背景和依赖关系:所有数据都存储在分布式MySQL数据库中.我们有两个访问数据库的系统 - 一个执行常规任务,用Java和我们的Web应用程序编程 - 目前是Apache2,PHP(Zend1框架)和JavaScript(jQuery).
Java应用程序将不会重新设计,数据库应保留为MySQL.
Web应用程序应该更改为REST API和通过JSON进行通信的现代,快速,实时的AngularJS前端.
由于我们已经在PHP中编写了所有后端功能,因此坚持使用PHP用于REST API可能是有意义的 - 但如果它使未来的开发更容易,更快速和面向未来,那么这不是必须的.
Java应用程序和Web应用程序共享一些MySQL查询.
问题:
谢谢!
所以,我决定学习DDD,因为它似乎解决了我一直面临的一些架构问题.虽然有很多视频和示例博客,但我还没有遇到一个指导我解决以下场景的方法:
假设我有实体
public class EventOrganizer : IEntity
{
public Guid Id { get; }
public string Name { get; }
public PhoneNumber PrimaryPhone { get; }
public PhoneNumber AlternatePhone { get; private set; }
public Email Email { get; private set; }
public EventOrganizer(string name, PhoneNumber primaryPhoneNr)
{
#region validations
if (primaryPhoneNr == null) throw new ArgumentNullException(nameof(primaryPhoneNr));
//validates minimum length, nullity and special characters
Validator.AsPersonName(name);
#endregion
Id = new Guid();
Name = name;
PrimaryPhone = primaryPhoneNr;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:假设这将被转换并提供给MVC视图,并且用户想要更新AlternatePhone,电子邮件以及对于给定的有界上下文在该实体中存在有意义的许多其他属性(为简洁起见未示出) ) …