软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

3
SOA服务组合实际上在实践中有效吗?
SOA主要服务设计原则之一是服务可组合性原则(https://en.wikipedia.org/wiki/Service_composability_principle)。 这个想法是,通过使用现有服务作为构建模块来组合新服务,可以迅速开发新服务。类似于实现新方法时如何调用对象的现有方法。这就是SOA可以大大提高生产力的地方。 实际上有人真的这样做吗?我已经在书面文本中看到了无休止的重复,但是我自己还没有在现实世界中工作的经验。本书的大部分内容都没有提及事务处理,这在我看来是实现可组合服务的最大障碍。 首先,在组成任何非平凡的服务之前,您确实确实需要解决交易问题。当然,如果该示例具有服务“ findCurrentTime()”和“ writeLogMessage()”,则很容易不必担心事务,但是在具有诸如“ depositMoney()”和“ withdrawMoney()”之类的真实示例时则不必担心。 我知道两个选择: 使用WS-Atomic Transaction或类似工具实施真实交易 实施基于补偿的解决方案,使用“ cancelA()”或类似方法补偿对A的调用,如果对B的调用失败 这两个问题似乎都非常棘手/对我来说几乎无法使用: WS-原子交易 一个很大的复杂性,大多数的建议,我发现只是警告“疼痛的屁股,不这样做” 支持是有限的,例如,如果您使用开源ESB,则主要替代产品ServiceMix,Mule或WSO2不支持它 赔偿金 对我来说,实施赔偿处理似乎很复杂。如果服务A成功并且我们从未从服务B得到答案并且不知道它是失败还是成功,我们该怎么办?手动处理这种逻辑(作为合成服务的实现者)使我想裂开手腕-这是某些工具应该为我完成的工作! 我也看不到如何在非平凡的服务中使用补偿方法。假设您的服务A是“ depositMoney()”,并且成功,其他一些操作很快将钱转移到其他地方,然后我们收到“ compensateDepositMoney()”,我们现在该怎么办?好像一大罐蠕虫。 在我看来,服务组合是SOA的一项基本原则,如果您不能(方便地)组合服务,那么您真的无法获得SOA的好处。现实是什么?90%的SOA用户在没有实际服务组合的情况下使用“ crispled SOA”?还是大多数用户实际上使用服务组合,而我却夸大了它的难度?

5
(接受)测试驱动开发的相对成本效率
我想知道资源计划对软件项目的总体影响是什么,项目的需求和设计是由自动验收测试和单元测试驱动的,而不是软件开发的“传统”方法。 根据您的经验,与采用更多“传统”开发方法相比,在TDD下完成软件项目对资源需求的总体影响是什么?在我看来,质量会提高,不确定性会减少,这是因为测试要早完成,但是要求提前进行测试似乎需要更多开发人员时间才能完成。由于预先消除了错误,开发工作量增加了多少,或者实际上减少了多少? 客户需要多少努力?他们是否必须改变与项目相关的方式,特别是如果它们习惯于预先进行大型设计?客户总体所需的小时数是否增加了,或者实际上减少了? 我可以想象,在TDD项目开始时(因为没有软件开发计划),在TDD迭代过程中时间估计将非常模糊。例如,是否有20%的项目能使信心增加到足以最终为客户提供或多或少的稳定时间和金钱估算? 注意:我不是在这里寻找主观意见或理论,所以请不要spec测。我正在寻找更多有关TDD的真实经验。
15 tdd  estimation 


2
实体到DTO的使用
一直在尝试提出基本的分层Web应用程序的流程,并一直在线阅读有冲突的信息。我想弄清楚的是,通过使用某种映射器,仍然可以从DAO到Service层继续使用DTO对象是否有优势。 我预见的基本流程如下: UI模型/表单->控制器 控制器将模型转换为域对象(实体) 域对象->服务层 域对象-> DAO DAO->域对象 服务-> UI UI将Domain转换为UI模型 如果遵循DTO,则DAO将回传DTO,而不是实体。经过一番阅读后,由于(至少在Java中)实体已成为带注释的POJO,因此DTO似乎已经失效,这意味着它们的内存占用量已经很小。 是这种情况,还是应该使用DTO将域对象完全封装在DAO层中?如果是这种情况,服务层将如何传递给DAO? 谢谢一群!
15 java  entity  jpa 

4
GPL中是否存在允许专有软件与GPL库链接的漏洞?
让我们研究一个假设的场景: X公司编写一个专有程序(A),该程序与专有库(B)动态链接。Y公司希望使用GPL许可的替代库(C),因此编写了一个包装器库(D),该包装器动态链接到A和C,并将A使用的API调用转换为C使用的API调用。 由于D打算与C一起使用,并且使用C的API调用,因此D是C的派生作品,因此必须根据GPL *的条款进行分发。结果,A和D的合并工作也必须按照GPL的条款进行分配,鉴于Y公司不拥有A的源代码,这是不可能的。也就是说,只要Y公司自己分配D , 没有问题。但是,无论公司Y采取什么行动,公司X都不会通过分配A来违反GPL,即使没有B。D的存在也并不意味着A突然是C的衍生作品(通过D),必须根据C获得许可。 GPL也是如此。 现在,这是漏洞:没有什么东西是从编写自己的d的版本,从单独发布它,并告诉最终用户使用的,而不是乙d停止X公司在运行A.看来,一个公司能够设计专有程序以使用GPL库而不会违反GPL,只要使用包装程序模块将专有程序与GPL库隔离开,并且该模块是单独分发的。 我的推理正确吗?这是GPL中的真正漏洞吗? * D也是A的派生作品,但出于本场景的目的,X公司已明确授权创建D并允许其根据GPL进行许可。
15 gpl 

2
为什么在C11中使用丑陋的关键字?
我目前正在阅读C11规范的草案。新引入的关键字:_Bool, _Alignof, _Atomic都感觉像是自定义扩展名,而不是标准的保留关键字,如struct, union, int。 我意识到该标准基本上由标准化扩展组成...但是,这真是太糟糕了!也许我们很快就会__Long_Long_Reallylong_Integer_MSVC_2020_t以标准为最终结局! 非标准代码的向后兼容性是关键字新样式的唯一原因吗?
15 c  keywords 

4
仅关注成功或失败时返回布尔值
我经常发现自己从一个方法返回一个布尔值,该方法用于多个位置,以便将一个方法周围的所有逻辑包含在一个地方。所有(内部)调用方法都需要知道该操作是否成功。 我正在使用Python,但问题不一定特定于该语言。我只能想到两种选择 引发异常(尽管情况并不特殊),并记住在调用函数的每个位置都捕获该异常 在执行操作时返回布尔值。 这是一个非常简单的示例,演示了我在说什么。 import os class DoSomething(object): def remove_file(self, filename): try: os.remove(filename) except OSError: return False return True def process_file(self, filename): do_something() if remove_file(filename): do_something_else() 尽管它是功能性的,但我真的不喜欢这种做事的方式,它“闻起来”,有时会导致很多嵌套的if。但是,我想不出一种更简单的方法。 os.path.exists(filename)在尝试删除之前,我可以使用更多的LBYL原理并使用它,但是不能保证文件不会同时被锁定(这不太可能,但是可能),我仍然必须确定删除是否成功。 这是“可接受的”设计吗?如果不是,那么设计它的更好方法是什么?

1
确保Web API安全的最佳做法是什么?
我需要为我们的移动应用程序构建一个Web服务API,以便与我们的服务器和数据库进行交互(在ASP.Net MVC 4中,但这无关紧要)。虽然大多数操作不需要用户注册我们的服务,但我们只想限制我们应用程序用户的访问。 有什么方法可以确保拒绝从其他地方(例如,需要我们的所有数据或构建非官方应用程序的人)进行的调用? 我最初的想法是让设备向服务器请求令牌,该令牌是随机生成并按原样发送的。所有其他方法将检查请求标头是否包含特定的标头,该标头将是咸化令牌的md5哈希。服务器知道令牌和盐,并且能够计算哈希并将其与发送的哈希进行比较。另外,令牌的使用寿命有限,并且设备必须每隔一小时获得另一个令牌。 这似乎很容易实现,尽管可能不是100%证明,但这似乎是一个好主意。你怎么看?

2
我应该使用工厂方法而不是构造函数。我可以更改它并且仍然向后兼容吗?
问题 假设我有一个名为的类DataSource,它提供了ReadData一种从.mdb文件中读取数据的方法(也许还有其他方法,但为了简单起见): var source = new DataSource("myFile.mdb"); var data = source.ReadData(); 几年后,我决定.xml除了.mdb文件作为数据源之外,还希望能够支持文件。.xml和.mdb文件的“读取数据”实现完全不同。因此,如果我要从头开始设计系统,则可以这样定义: abstract class DataSource { abstract Data ReadData(); static DataSource OpenDataSource(string fileName) { // return MdbDataSource or XmlDataSource, as appropriate } } class MdbDataSource : DataSource { override Data ReadData() { /* implementation 1 */ } } class XmlDataSource …

1
打包用于Debian的PHP Web应用程序的好方法
许多PHP Web应用程序都遵循此模型进行安装和升级: 解压源tar球。 将Apache指向源代码。 将Web浏览器导航到主页。 浏览几个设置页面(例如,检查是否存在库,询问数据库连接信息,创建或更新数据库架构等)。 用户将install/目录重命名为其他目录,以便应用程序知道该目录已安装。 在没有让用户安装软件包的过程中,我看不出有任何(简单)的方式来创建Debian软件包。请注意,我不是该应用程序的开发人员,因此无法直接更改该应用程序的安装方式。 打包此类应用程序的典型方法是什么?

4
为什么关系数据库仅接受SQL查询?
据我所知,大多数关系数据库不提供任何用于查询的驱动程序级API,只有query将SQL字符串作为参数的函数除外。 我在想,如果可以做的话,会变得多么容易: var result = mysql.select('article', {id: 3}) 对于联接的表,它会稍微复杂一些,但仍然可能。例如: var tables = mysql.join({tables: ['article', 'category'], on: 'categoryID'}); mysql.select(tables, {'article.id': 3}, ['article.title', 'article.body', 'category.categoryID']) 代码更简洁,没有字符串解析开销,没有注入问题,更易于重用查询元素...我可以看到很多优点。 为什么选择仅通过SQL提供对查询的访问有特定原因吗?
15 database  sql 

5
命名上传图像的最佳做法是什么?
假设我的Web应用程序中有一个表单,用户可以在其中上传个人资料图片。 我对文件大小,尺寸等几乎没有要求,但是当用户上传图像时,如何在系统上命名它们?我想它需要保持一致并且也是唯一的。 也许是GUID? a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg 时间戳记? 129899740140465735.jpg 哈希?例如:md5 b1a9acaf295cf14ffbc5b6538294562c.jpg 有没有标准或推荐的方法来做到这一点?

4
为什么Cem Kaner认为测试不显示bug浪费时间?
在肯定的测试中确认功能,证明其有效该怎么办?我应该说这是浪费时间吗?这句话背后是什么概念? 测试失败,即没有发现错误的测试是浪费时间。 Web工程:引用Cem Kaner 的Web应用程序系统开发学科。
15 testing  theory 

3
多少个嵌套函数调用?
从MSDN引用有关StackOverflowException的信息: 当执行堆栈溢出时引发的异常,因为它包含太多的嵌套方法调用。 Too many这里很模糊。我怎么知道什么时候真的太多了?数千个函数调用?百万?我认为它必须以某种方式与计算机中的内存量相关联,但是是否可以提出一个大致准确的数量级? 我对此很担心,因为我正在开发一个涉及大量使用递归结构和递归函数调用的项目。我不希望我的应用程序在开始用于多个小型测试时会失败。

5
技术精通的高级软件开发人员可以研究什么以保持改进[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 假设您已经编程超过10年了。您知道许多语言,但很少有非常详细的语言。您一直在设计解决方案的体系结构,从事并交付了较大的项目。您一直在研究模式,最佳实践,有效的编码准则,单元测试,多线程等。 然后,您逐渐感到一种感觉,即您阅读的大多数书籍每100页文字提供的信息越来越少。因此,他们开始提供递减的回报。您仍在学习,但不再进步。 与以前相比,为什么学习的生产力下降? 那时,它曾经改变您的思维方式,教给您新事物,拓宽了视野,后来改善了您当前的职业,或者允许发明/管理/建造新事物。为什么不再是这种情况?

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.