Questions tagged «design»

有关通过软件设计解决问题和计划解决方案的问题。

8
如果老板总是推迟有关需求和总体设计的重大决定怎么办?
当开始一个新项目时,我的老板总是避免做出固定的决定。他通常在说:好吧,就开始写点东西,并尽可能通用。当您完成后,我们将看看我们如何继续。他的论点基本上是您永远不知道和“敏捷开发”。 为了使问题尽可能笼统:如果老板不喜欢做决定,您会怎么做? 只是坚持并编写可能在几周后进行大量重构和部分重写的代码?还是继续讨论直到老板做出至少一些决定?这或多或少是我目前的策略。因为这就像物理定律,所以在某些时候需要交付一些东西。要么是因为老板的老板想看到结果,要么是因为某些时候东西变得荒谬。 我还发现老板几乎批评了所有事情。甚至是基于他自己的建议...

8
是否可以仅由编辑者构建高质量的网站,而无需了解HTML?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 从苹果到微软再到谷歌,许多大公司都在投入越来越多的钱来创建工具,使任何人都可以使用所见即所得的编辑器来创建网站。 例如,我刚从Adobe收到的这封电子邮件: 像Adobe®InDesign®布局一样轻松快捷地构建网站。 该应用程序的代号为“ Muse”,目前处于测试版状态,是一项新技术,使图形设计人员可以使用熟悉的,自由格式的工具来设计和发布HTML和CSS网站,而无需编写代码或只限于模板。成为这个令人难以置信的免费预览的一部分,并体验Muse将如何革新您为网络创建的方式。 作为Web开发人员,我无法预见Adobe或任何其他公司将创建某种解决方案的方法,基于以下原因,该解决方案允许不具备HTML / CSS / JS知识的用户构建有用的网站设计: 几乎可以肯定,生成的代码将是一团糟,这使得想要编写网站后端的程序员很难使用它。甚至可能需要他们自己更改代码以根据需要构造代码。 HTML不是基于像素的,因此很难开发一种可以轻松设计可随文本大小等变化而流动的模板的工具。此外,元素应以合理的顺序而不是随机的顺序相互跟随(例如,根据添加元素时的要求。 在一个工具中生成的代码可能不会轻易移植到其他工具中,从而将您锁定在原始工具中。 (我假设该工具将允许对网站进行完全控制;正如Adobe所说,“与Adobe InDesign布局一样快速,轻松”。让您使用经过专业设计的模板的程序是另一回事。) 您认为一个不懂HTML的人有可能创造出高质量的(幕后和外观)网页设计/网站吗?
12 design  html  wysiwyg 

8
面向对象的类设计
我想知道好的面向对象的类设计。特别是,我很难在以下两个选项之间做出选择: 静态与实例方法 没有参数或返回值的方法 vs 有参数和返回值的方法 重叠与独特的方法功能 私人与公共方法 范例1: 此实现使用实例方法,没有返回值或参数,没有重叠的功能,并且所有方法都是公共的 XmlReader reader = new XmlReader(url); reader.openUrl(); reader.readXml(); Document result = reader.getDocument(); 范例2: 此实现使用静态方法,返回值和参数,功能重叠和私有方法 Document result = XmlReader.readXml(url); 在示例一中,所有方法都是公共实例,这使得它们易于进行单元测试。尽管所有方法都不同,但readXml()依赖于openUrl(),因为必须首先调用openUrl()。所有数据都在实例字段中声明,因此,除了构造函数和访问器之外,任何方法都没有返回值或参数。 在示例二中,只有一种方法是公共的,其余的是私有静态的,这使得它们很难进行单元测试。方法是重叠的,因为readXml()调用openUrl()。没有字段,所有数据均作为方法中的参数传递,并且结果立即返回。 我应该遵循什么原则来进行正确的面向对象编程?

9
继承出错
我有一些代码,其中一个好的继承模型已经走下坡路,我试图理解为什么以及如何修复它。基本上,假设您有一个Zoo层次结构,其中: class Animal class Parrot : Animal class Elephant : Animal class Cow : Animal 等等 您有自己的eat(),run()等方法,一切都很好。有一天,有人来说-我们的CageBuilder类工作得很好,并使用了animal.weight()和animal.height(),但新的非洲野牛实在太强了,可以打碎墙壁,所以我要补充一下Animal类的另一个属性是isAfricanBizon(),并在选择材质时使用该属性,并且仅对AfricanBizon类覆盖它。下一个人来做类似的事情,下一件事您知道您具有所有特定于基类中层次结构子集的属性。 改善/重构此类代码的好方法是什么?这里的一种替代方法是只使用dynamic_casts来检查类型,但是这会使调用者混乱,并在整个位置添加一堆if-then-else。您可以在此处具有更多特定的接口,但是如果您仅有的话,那么基类引用也无济于事。还有其他建议吗?例子? 谢谢!

8
您如何使经理了解敏捷?
我对一位不了解迭代开发的高级主管有疑问(更不用说敏捷了)。他坚持要在编写任何代码行之前先完成我们的软件设计规范(SDS)。对他来说,完整意味着所有功能细节都在那里。另外,作为一名前Cobol程序员,他希望查看“模块”和流程图。这是一个Java Web应用程序,可大声喊叫! 无论如何,我试图找到一个简单的位置来轻轻地指点他,以表明在开始编码之前SDS不一定是100%完整的(也不能完整)。有什么建议? 谢谢!

10
领导团队,我太霸道了吗?
我处于一个非常奇怪的位置。我是特定项目的“团队负责人”,职位是高级软件工程师。在我的团队中,我有4个开发人员,其中一个在另一个项目中担任类似的角色,但是现在我的工作已被优先考虑,因此他正在研究我的工作。我也有2位测试员,其中一位是经理。团队的另一个成员是“客户代表”,他是一个完全无关的部门的一部分。我还有一个直接位于我上方的经理,而且我相信也是位于团队中的测试经理的上方...虽然对此不太确定。 我试图弄清为什么我的角色正好是几次。对于我来说,即使我有权力,也很难弄清楚我的权威在哪里开始和结束。我目前正在使用的答案是,我是团队的“技术主管”。这似乎意味着我的权限超过了与产品代码本身相关的,与体系结构,设计和过程/编码标准有关的技术决策。 今天,出现了一些问题,我将代码结果委托给团队中的一位成员,并在我们的Scrum全面展示会议上向公司的其他成员展示了这些结果。客户代表人进行炫耀。今天展示了一些我真的不同意的东西,甚至没人问我是否想对发生的事情发表意见。简而言之,为了提供用户以下列方式在报告中显示值的能力(“ doc”单位,设计单位(四舍五入而不是四舍五入)),他们为每个排列提供了访问字段。因此,我们具有舍入文档单位,舍入设计单位,未舍入文档单位,未舍入设计单位的价值。用户希望使用的每个记录都有许多这样的值,并且每个记录都以这种方式排列。 我真的很讨厌这个 向我们展示这些内容的人想要确保我们用于报表的API与我们执行诸如将数据导出到Excel之类的方式相同。不幸的是,现在我们正朝着我认为非常非常糟糕的方向发展。 在下一次会议上,我确实有点不高兴,我问做这件事的两个人,“我为什么不参与这个决定?” 这是一个不断出现的问题,我很难过,似乎只是让我领导的团队成员问我是否要参与其中。有时我不会,我认为他们想出的办法都会很好。有时候我会。除非人们问我,尽管很难知道正在发生的事情需要我的投入,而他们却没有给我机会。 不幸的是,我的权限并没有告诉别人:“下次您离开并且自己做这样的事情而没有与我交谈时,您将受到纪律处分。” 那是一个“公关”问题,这显然不在我的权限范围之内。实际上,这对我很好,因为如果有人愿意,我不想面对这种垃圾。 但是今天,我的经理在所有人面前(我想这也是我提出这样的错误的部分原因)告诉我,我不能参与所有决定,而需要委托。 我当然认为我是对的。我不是说我认为是BS。我认为应该就此问题与我联系,并询问我是否有更好的主意。我的方向实际上是决定现在提供一个值,因为这实际上是新功能的最开始阶段,并讨论在将来需要时提供进一步访问的选项。我永远不会批准或推荐当前的实现方式,而且我真的认为它不应该成为现实。 问题是,我是一个不合理的人吗? 好吧,我们两个人讨论了这个问题,并同意我们俩都“丢球”,而且我们似乎在同一页上。星期一早上...我们将尝试确保我在团队中的角色清楚,是的,我要决定何时需要进行设计或任务更改。我被提议同意或者决定我需要更深入地研究。然后,我可以尝试其他一些工作,以确保他们知道可以来找我。

5
擅长后端,但前端不好
我想开始Web开发,我一直在学习php。 我有Java,Python和C ++的 经验,这种经验使我擅长于Web开发的后端。 但是我在设计和图形方面很糟糕。 我要启动网站。 你们建议我做什么? 如果您的建议是要更好地使用图形,那是个好方法吗? 我也想知道你们在设计和图形上使用了什么,什么是学习的好地方?

4
避免使用初始化方法
我有这个现有的代码,其中他们有一个类和该类中的初始化方法。预期一旦创建了类的对象,他们就需要在其上调用initialize。 初始化方法存在 的原因该对象要尽早创建以具有全局作用域,然后在加载依赖的dll之后再调用初始化方法。 具有初始化 的问题该类现在具有此bool isInitialized,需要在每个方法中进行检查,然后再继续进行,如果未初始化则返回错误。简而言之,这是一个很大的痛苦。 一种可能的解决方案 在构造函数中初始化。仅在全局范围内有一个指向该对象的指针。加载dll后创建实际对象。 上述解决方案的问题 任何创建此类的对象的人都必须知道,仅在dll被加载后才需要创建该对象,否则它将失败。 这可以接受吗?

8
构造函数通常不应调用方法
我向同事描述了为什么调用方法的构造函数可以是反模式。 示例(在我生锈的C ++中) class C { public : C(int foo); void setFoo(int foo); private: int foo; } C::C(int foo) { setFoo(foo); } void C::setFoo(int foo) { this->foo = foo } 我想通过您的额外贡献更好地激发这一事实。如果您有示例,书籍参考,博客页面或原则名称,将非常欢迎他们。 编辑:我一般来说,但我们在python中编码。
12 design 

5
修改通过引用传递的对象是不好的做法吗?
过去,我通常会在创建/更新对象的主要方法中对对象进行大部分操作,但是最近发现自己采用了另一种方法,我很好奇它是否是不好的做法。 这是一个例子。假设我有一个接受User实体的存储库,但是在插入该实体之前,我们调用一些方法以确保其所有字段都设置为所需的值。现在,不是调用方法并从Insert方法中设置字段值,而是调用一系列准备方法,这些方法在对象插入之前对其进行成形。 旧方法: public void InsertUser(User user) { user.Username = GenerateUsername(user); user.Password = GeneratePassword(user); context.Users.Add(user); } 新方法: public void InsertUser(User user) { SetUsername(user); SetPassword(user); context.Users.Add(user); } private void SetUsername(User user) { var username = "random business logic"; user.Username = username; } private void SetPassword(User user) { var password = "more …

1
保持逻辑和物理架构图的更新
在任何涉及具有多个开发人员的分布式系统的软件开发项目中,拥有逻辑和物理体系结构图是最佳实践,但是以我的经验,这些图总是在项目开始时就得到很好的维护,但是在项目发布时不会得到更新维护阶段就开始了。 对于具有很多分布式过程的复杂项目,由于没有人知道所有的知识,因此即使在最初发布之前,这些图也往往会很快变得过时或不准确。 在这种背景下,我想向社区提出以下问题: 拥有准确且最新的逻辑和物理架构图有多重要? 是否有任何工具和流程可以帮助他们保持最新状态? 谁应该负责使它们保持最新状态?系统管理员,开发人员和质量检查团队如何贡献力量?

4
当需要大量输入数据时,如何在微服务架构中使用规则引擎?
现在的情况 我们正在微服务架构中实现(现在正在维护)在线购物Web应用程序。 要求之一是,企业必须能够对客户添加到购物车中的商品应用规则,以自定义其体验和最终订单。很显然,必须建立业务规则引擎,并且为此我们实现了一个特定的“微服务”(如果仍然可以这样)。 在过去的一年中,此规则引擎变得越来越复杂,需要越来越多的数据(例如购物车的内容以及用户信息,他的角色,他的现有服务,一些账单信息等)才能计算这些规则。 目前,我们的shopping-cart微服务正在从其他微服务收集所有这些数据。即使部分资料已由所使用shopping-cart,大部分时间主要还是用来提供规则引擎。 新要求 现在,需要其他应用程序/微服务来重用规则引擎以实现类似的需求。因此,在当前情况下,他们将必须传输相同类型的数据,调用相同的微服务并构建(几乎)相同的资源才能调用规则引擎。 照原样继续,我们将面临几个问题: 每个人(称为规则引擎)都必须重新实现对数据的获取,即使他们自己不需要数据也是如此。 对规则引擎的请求很复杂; 继续朝这个方向发展,我们将不得不在整个网络上传输许多请求的数据(想想μsA调用μsB调用规则引擎,但是A已经有了规则引擎需要的一些数据); shopping-cart 由于所有数据的获取而变得巨大; 我可能会忘记很多…… 我们怎样做才能避免这些麻烦? 理想情况下,我们将避免为规则引擎增加更多的复杂性。我们还必须确保它不会成为瓶颈-例如,某些数据的获取速度相当慢(10 s甚至更多),因此我们实施了预提取,shopping-cart以便在调用规则之前数据更有可能存在引擎,并保持可接受的用户体验。 一些想法 让规则引擎获取所需的数据。这将增加它的复杂性,违反了单一责任原则(甚至更多……); 在规则引擎获取数据之前实施代理μs; 实施规则引擎调用的“数据获取程序”μs,以一次获取其所需的所有数据(复合查询)。

3
依赖倒置原则与“编程到接口而不是实现”
我试图了解依赖倒置原则与“程序到接口,而不是实现”原则的区别。 我了解“对接口编程,而不是实现”的含义。我也了解它如何允许更灵活和可维护的设计。 但是我不理解依赖关系反转原理与“程序到接口,而不是实现”原理有何不同。 我在网上的几个地方都读到了DIP,但这并没有消除我的困惑。我仍然看不到这两个原则之间的区别。谢谢你的帮助。

3
您如何在OOP中进行班级设计?
当我尝试设计OO解决方案时,通常使用CRC建模,其中列出了类名(名词),它们的作用(动词)以及它们与其他类的协作方式。 关于此名词-动词方法,此博客有以下要说的话 ...This approach, which I will call “noun and verb,” is so limited I’ll dare to call it brain damaged.... 我的问题是,使用OO方法是否存在更好的建模技术?

5
您是否利用了封闭式原则的好处?
开闭原理(OCP)指出对象应打开以进行扩展,但应关闭以进行修改。我相信我理解它,并将其与SRP结合使用来创建仅做一件事的类。而且,我尝试创建许多小的方法,使所有行为控件都可以提取到可以在某些子类中扩展或重写的方法中。因此,我最终得到了具有许多扩展点的类,包括:依赖项注入和组合,事件,委托等。 考虑以下简单的可扩展类: class PaycheckCalculator { // ... protected decimal GetOvertimeFactor() { return 2.0M; } } 现在说,例如,OvertimeFactor更改为1.5。由于上述类是为扩展而设计的,因此我可以轻松地子类化并返回一个不同的OvertimeFactor。 但是 ...尽管该类是为扩展而设计的,并且坚持使用OCP,但我将修改单个方法,而不是子类化和覆盖该方法,然后在IoC容器中重新连接对象。 结果,我违反了OCP尝试完成的部分工作。感觉就像是在偷懒,因为上面的内容要容易一些。我是否误解了OCP?我真的应该做些不同的事情吗?您是否以其他方式利用OCP的优势? 更新:根据答案,由于许多不同的原因,这个人为的例子似乎是一个糟糕的例子。该示例的主要目的是证明该类是通过提供以下方法来扩展的:该方法在被重写时将更改公共方法的行为,而无需更改内部或私有代码。不过,我绝对误会了OCP。

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.