Questions tagged «architecture»

软件系统的高级设计和描述。架构设计提取了实现,算法和数据表示的细节,以专注于“黑匣子”组件的交互。

30
如何创建自己的编程语言和用于它的编译器[关闭]
我对编程很了解,并且遇到过各种语言,包括BASIC,FORTRAN,COBOL,LISP,LOGO,Java,C ++,C,MATLAB,Mathematica,Python,Ruby,Perl,JavaScript,Assembly等。我不明白人们是如何创建编程语言并为其设计编译器的。我也无法理解人们如何创建Windows,Mac,UNIX,DOS等操作系统。对我来说,另一件事是神秘的,人们如何创建像OpenGL,Op​​enCL,OpenCV,Cocoa,MFC等之类的库。我无法弄清的最后一件事是科学家如何设计微处理器的汇编语言和汇编器。我真的很想学习所有这些知识,而且我今年15岁。我一直想成为计算机科学家,例如Babbage,Turing,Shannon或Dennis Ritchie。 我已经读过Aho的Compiler Design和Tanenbaum的OS概念书,他们都只在高层次上讨论概念和代码。它们不涉及细节和细微差别,也不涉及如何设计编译器或操作系统。我需要一种具体的理解,以便我自己创建一个,而不仅仅是对线程,信号量,进程或解析的理解。我问我兄弟这一切。他是麻省理工学院EECS的SB学生,对如何在现实世界中实际创建所有这些东西一无所知。他所知道的只是对编译器设计和OS概念的理解,就像你们提到的(即线程,同步,并发,内存管理,词法分析,中间代码生成等)一样。

17
过早的优化真的是万恶之源吗?
我的一位同事今天提交了一个名为的类ThreadLocalFormat,该类基本上将Java Format类的实例移动到了线程本地中,因为它们不是线程安全的,而且创建起来“相对昂贵”。我写了一个快速测试,计算出我每秒可以创建200,000个实例,问他是否创建了那么多实例,对此他回答“远不及那么多”。他是一位出色的程序员,并且团队中的每个人都非常熟练,因此我们对所生成的代码毫无疑问,但这显然是在没有实际需要的情况下进行优化的情况。他应我的要求取消了代码。你怎么看?这是“过早优化”的案例吗,真的有多糟糕?

16
使用单一责任原则时,什么构成“责任”?
显然,“单一责任原则”并不意味着“只做一件事情”。那就是方法的目的。 public Interface CustomerCRUD { public void Create(Customer customer); public Customer Read(int CustomerID); public void Update(Customer customer); public void Delete(int CustomerID); } 鲍勃·马丁说:“班级应该只有一个改变的理由。” 但是,如果您是SOLID的新手,那么很难下定决心。 我写了另一个问题的答案,在那儿我建议责任就像职位,然后用饭店的比喻来阐明我的观点。但这仍未阐明某人可以用来定义其班级职责的一组原则。 你是怎么做到的?您如何确定每个班级应承担的责任,以及如何在SRP中定义责任?


17
从不存在返回值的函数/方法中返回NULL或空值更好吗?
我在这里寻找建议。我正在努力在不存在返回值或无法确定返回值的情况下从方法返回NULL还是返回空值更好。 以以下两种方法为例: string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. 在中ReverseString(),我会说返回一个空字符串,因为返回类型是字符串,因此调用者期望得到。同样,通过这种方式,调用方将不必检查是否返回了NULL。 在中FindPerson(),返回NULL似乎更合适。无论是否new Person()返回NULL或空的Person Object(),调用者都必须在对其进行任何操作(如调用UpdateName())之前检查一下Person对象是否为NULL或为空。因此,为什么不只在此处返回NULL,然后调用方只需检查NULL。 还有其他人为此感到挣扎吗?任何帮助或见解表示赞赏。

9
讨厌多重继承吗?
我一直很喜欢在一种语言中支持多重继承的想法。尽管通常是故意放弃的,但所谓的“替换”是接口。接口根本不能涵盖所有相同的多重继承,并且这种限制有时可能会导致产生更多样板代码。 我听说过的唯一基本原因是基类的钻石问题。我就是不能接受。对我来说,它的表现非常糟糕,例如:“嗯,有可能将其弄糟,所以这自然不是一个好主意。” 但是,您可以用编程语言修改任何内容,我的意思是。我只是不能认真对待这一点,至少没有没有更彻底的解释。 仅知道这个问题就占了90%。此外,我想我几年前听说过涉及通用解决方案的问题,该解决方案涉及“信封”算法或类似的东西(有人敲响铃吗?)。 关于钻石问题,我能想到的唯一潜在的真正问题是,如果您正在尝试使用第三方库,并且看不到该库中两个看似无关的类具有共同的基类,那么除了例如,文档是一种简单的语言功能,可能要求您明确声明要创建菱形的意图,然后才能为您实际编译菱形。有了这样的功能,任何钻石的制造要么是故意的,鲁ck的,要么是因为人们没有意识到这一陷阱。 所有人都这么说... 大多数人是否有真正的理由讨厌多重继承,还是仅仅是一堆歇斯底里会造成弊大于利?有没有我在这里看不到的东西?谢谢。 例 汽车扩展了WheeledVehicle,KIASpectra扩展了汽车和电子产品,KIASpectra包含无线电。为什么KIASpectra不包含电子产品? 因为它是电子的。继承vs.组合应该始终是is-a关系vs.has-a关系。 因为它是电子的。上下都有电线,电路板,开关等。 因为它是电子的。如果冬天电池没电了,您的麻烦就好像所有车轮突然丢失一样。 为什么不使用接口?以#3为例。我不想一遍又一遍地写这个,而且我真的不想创建一些奇怪的代理帮助器类来做到这一点: private void runOrDont() { if (this.battery) { if (this.battery.working && this.switchedOn) { this.run(); return; } } this.dontRun(); } (我们不会考虑该实现的好坏。)您可以想象如何可能有一些与电子相关的功能与WheeledVehicle中的任何内容都不相关,反之亦然。 我不确定是否要解决该示例,因为那里有解释的空间。您还可以考虑从平面扩展Vehicle和FlyingObject,以及从Bird扩展Animal和FlyingObject,或者从更纯粹的示例方面进行思考。

8
依赖注入的批评和弊端
依赖注入(DI)是一种众所周知的流行模式。大多数工程师都知道它的优点,例如: 使单元测试中的隔离变得可能/容易 明确定义一个类的依赖 促进良好的设计(例如,单一职责原则(SRP)) 启用快速(开关实现DbLogger的,而不是ConsoleLogger例如) 我认为业界普遍认为DI是一种很好的有用模式。目前没有太多批评。社区中提到的缺点通常很小。他们中的几个: 增加班数 创建不必要的接口 目前,我们与同事讨论建筑设计。他相当保守,但思想开放。他喜欢质疑一些我认为很好的事情,因为IT领域中的许多人只是复制最新趋势,重复优势,而且通常不会考虑太多-不要分析得太深。 我想问的是: 只有一个实现时,应该使用依赖注入吗? 我们应该禁止创建除语言/框架对象之外的新对象吗? 如果我们不打算对特定的类进行单元测试,那么注入单个实现是个坏主意(假设我们只有一个实现,因此我们不想创建“空”接口)吗?

10
不要在C#中使用“静态”?
我提交了我写给其他一些架构师的应用程序,以供代码审查。其中一个几乎立即写信给我,说:“不要使用“静态”。您不能使用静态类和方法编写自动测试。要避免使用“静态”。 我检查了一下,并将全部1/4的班级标记为“静态”。当我不打算创建类的实例时,我会使用static,因为该类是整个代码中使用的单个全局类。 他继续提到了涉及模拟,IOC / DI技术的一些静态代码无法使用的技术。他说,由于第三方库不可测试,当第三方库为静态库时很不幸。 这个建筑师是正确的吗? 更新:这是一个示例: APIManager-此类保留我正在调用的第三方API的字典以及下一个允许的时间。它强制执行许多第三方在其服务条款中规定的API使用限制。我可以通过调用Thread.Sleep(APIManager.GetWait(“ ProviderXYZ”))在调用第三方服务的任何地方使用它;在拨打电话之前。这里的所有内容都是线程安全的,并且与C#中的TPL一起使用时效果很好。

5
C#中异步/等待用法的准则是否与好的架构和抽象分层的概念相矛盾?
这个问题与C#语言有关,但我希望它涵盖其他语言,例如Java或TypeScript。 Microsoft建议在.NET中使用异步调用的最佳做法。在这些建议中,让我们选择两个: 更改异步方法的签名,以便它们返回Task或Task <>(在TypeScript中,这将是Promise <>) 更改异步方法的名称以xxxAsync()结尾 现在,当用异步组件替换低级同步组件时,这会影响应用程序的整个堆栈。由于异步/等待仅在“一直使用”时才有积极影响,因此这意味着必须更改应用程序中每一层的签名和方法名称。 好的体系结构通常涉及在每个层之间放置抽象,这样高层组件就看不到用其他组件替换低层组件。在C#中,抽象采用接口的形式。如果我们引入了一个新的,低级的异步组件,则调用堆栈中的每个接口都需要修改或替换为一个新接口。在实现类中解决问题(异步或同步)的方式不再对调用方隐藏(抽象)。调用者必须知道它是同步还是异步。 异步/等待与“良好架构”原则相抵触的最佳做法吗? 这是否意味着每个接口(例如IEnumerable,IDataAccessLayer)都需要它们的异步对应项(IAsyncEnumerable,IAsyncDataAccessLayer),以便在切换到异步依赖项时可以在堆栈中对其进行替换? 如果我们进一步推论这个问题,那么假设每个方法都是异步的(返回Task <>或Promise <>),并且使方法在实际上不是实际的情况下同步,会不会更简单?异步?这是将来的编程语言所期望的吗?
103 c#  architecture  async 

9
为什么要使用依赖注入?
我很难找到有关为什么应该使用依赖项注入的资源。我看到的大多数资源都说明它只是将一个对象的实例传递给另一个对象的实例,但是为什么呢?这是仅用于更干净的体系结构/代码,还是会整体上影响性能? 为什么要执行以下操作? class Profile { public function deactivateProfile(Setting $setting) { $setting->isActive = false; } } 而不是以下? class Profile { public function deactivateProfile() { $setting = new Setting(); $setting->isActive = false; } }

17
设计一种架构,认为可以将用户界面类替换为命令行界面,这是一个好主意吗?
在第25页的“代码完成”中,据说可以用命令行轻松替换常规用户界面类是一个好主意。 知道其测试优势,它可能带来什么问题呢? 这项额外的工作真的能为Web和移动项目带来回报吗?中小型项目呢?相同的规则适用吗?如果这会使您的设计更复杂怎么办?

10
为什么艾伦·凯(Alan Kay)说:“互联网做得很好,但是网络是由业余爱好者提供的”?
好的,我这样解释。完整报价: 互联网做得如此之好,以至于大多数人将其视为像太平洋这样的自然资源,而不是人造的。上一次具有如此规模的技术如此无误的是什么时候?相比之下,网络是个玩笑。网络是由业余爱好者完成的。-艾伦·凯(Alan Kay)。 我正在尝试了解Internet和Web的历史,并且这种说法很难理解。我在其他地方读到过,互联网现在所使用的东西与设计时所用的东西截然不同,也许是其中的原因。 是什么使互联网如此出色,什么使网络如此业余? (当然,艾伦·凯很容易犯错,这里没有人是艾伦·凯,所以我们无法确切知道他为什么这么说,但是有什么可能的解释?) *另请参见原始采访 *。

9
当代码远离“干净代码”实践时,如何维护庞大的开源库?
我仍然缺乏编写高质量代码的经验,因此我阅读了解决诸如Robert C. Martin的Clean Code之类的问题的书籍,并不断检查著名库的代码以提高我的技能。 尽管许多开源库已经维护了多年,这意味着它们不太可能走在正确的道路上,但我发现其中许多代码与编写干净代码的原理相去甚远,例如包含数百行代码。 因此,我的问题是:干净代码的原则是否太受限制,我们可以在许多此类库中不使用它们吗?如果没有,如何在不考虑许多这些原则的情况下维护庞大的库? 任何简短的说明,我将不胜感激。如果这个问题对一个新手来说似乎很愚蠢,我深表歉意。 编辑 在Butterknife库中查看此示例-Butterknife库-Android社区中最知名的库之一。

7
微服务最被接受的交易策略是什么
我所看到的在具有微服务的系统中发生的主要问题之一是,事务跨不同服务时的工作方式。在我们自己的体系结构中,我们一直在使用分布式事务来解决此问题,但是它们带有各自的问题。迄今为止,僵局尤其令人痛苦。 另一个选择似乎是某种定制的事务管理器,它知道您系统内的流程,并会为您处理回滚,因为它是跨整个系统的后台进程(因此它将告诉其他服务回滚)如果它们出现故障,请稍后通知他们)。 还有其他可接受的选择吗?两者似乎都有其缺点。第一个可能导致死锁和许多其他问题,第二个可能导致数据不一致。有更好的选择吗?

17
如何训练自己,避免编写“聪明”的代码?[关闭]
您是否只需要用Expression s 来展示新技巧或将三个不同的过程归纳起来就知道吗?这并不一定要达到宇航员的规模,实际上可能会有所帮助,但是我不禁注意到其他人将以更清晰,直接(有时很无聊)的方式实现相同的类或程序包。 我注意到我经常通过过度解决问题来设计程序,有时是故意的,有时是出于无聊。无论哪种情况,我通常都会诚实地相信我的解决方案是清晰而优雅的,直到我看到相反的证据,但通常为时已晚。我中还有一部分人喜欢无证假设而不是代码重复,而更喜欢简单性。 我该怎么做才能抵制写“聪明的”代码的冲动,什么时候我应该做错了? 当我现在与一个经验丰富的开发人员团队一起工作时,问题变得更加严峻,有时我写智能代码的尝试即使是我自己,经过一段时间消除优雅的幻想似乎也是愚蠢的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.