软件工程

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

1
如果不接受在数字列中插入非数字值,SQLite会有用吗?
在SQLite中,以下语句将成功执行,并将字符串插入/更新到SALARY类型为的列中INTEGER: update employee set salary='TOO MUCH' where emp_id=1; 请注意,不会插入/更新零,而是实际的“ TOO MUCH”字符串,因此这与认证类型转换无关。 常见问题解答指出: 这是一个功能,而不是错误。SQLite使用动态类型。它不强制执行数据类型约束。任何类型的数据(通常)都可以插入任何列中。您可以将任意长度的字符串放入整数列,布尔列中的浮点数或字符列中的日期。您在CREATE TABLE命令中分配给列的数据类型不限制可以在该列中放入哪些数据。每列都可以容纳任意长度的字符串。(有一个例外:INTEGER PRIMARY KEY类型的列只能包含一个64位有符号整数。如果尝试将一个整数以外的任何内容放入INTEGER PRIMARY KEY列,则会导致错误。) 因此,这种行为显然是故意的,但是我想知道为什么 SQLite会有这种行为,因为我所知道的大多数其他SQL数据库的行为都大不相同,因此,当尝试将非数字字符串插入到数据库中时,它们将引发错误或将字符串转换为0一个数字列。 如果没有这种行为,SQLite库会不会有用呢? 这是设计使图书馆小而又快吗? 尝试在数字列中插入字符串时,SQLite库会明显变慢还是变大,以引起错误?
10 design  sqlite 

1
使用未经许可的代码
例如,我要找到一个已启动但尚未完全完成或尚未完成的github项目,我想在更大的项目中使用该代码,但是代码的作者尚未指定该代码的许可证,这是什么?此代码的可接受用法?我可以将其用于任何我喜欢的目的,或者代码上有隐式许可证吗? 但是我确实使用该代码,所以我肯定会提供感谢和参考原始作者(出于礼貌)。 但这又引发了两个额外的问题: 如果该代码可以在我的项目中使用,那么我可以自由地以与我的项目其余部分相同的方式来许可该代码,甚至可以仅通过自己的代码来许可吗? 如果您以后要在代码中添加许可证,那只会影响代码的未来版本吗?例如,如果我要叉一些未经许可的东西,然后原始作者添加了保留所有权利的版权-只要在添加许可证之前就可以使用该分叉的代码?

2
DDD-聚集大量子节点的根
首先,我会说我对DDD相对陌生,所以在这里我可能会犯一些基本错误! 我从事的项目涉及会计和交易(从财务角度而言)的概念。一个帐户可以针对它输入许多交易。 在我看来,“帐户”和“交易”都是实体,并且“帐户”是包含交易的汇总根,因为没有该帐户就无法存在“交易”。 但是,当我将其应用到代码中时,我立即遇到了问题。在许多情况下,始终拥有帐户中每个交易的列表对我来说并不是特别有用。我对能够执行诸如计算帐户余额和强制执行不变性(例如信用额度)之类的操作感兴趣,但是我也希望能够轻松处理一部分交易(例如,显示日期范围内的交易)。 在后一种情况下,如果我使用,则TransactionRepository可以有效地访问所需的那些对象,而无需加载整个列表(可能非常大)。但是,这将允许除帐户以外的其他事物与事务一起使用,这意味着我已经破坏了帐户作为聚合根的概念。 人们如何处理这种情况?您是否只接受为聚合根加载潜在大量子代所带来的内存和性能影响?

2
我可以使用分离但相等的对象更新附加对象吗?
我从外部API检索电影数据。在第一阶段,我将抓取每部电影并将其插入我自己的数据库中。在第二阶段中,我将使用API​​的“更改” API定期更新数据库,我可以查询该API以查看哪些电影的信息已更改。 我的ORM层是实体框架。Movie类如下所示: class Movie { public virtual ICollection<Language> SpokenLanguages { get; set; } public virtual ICollection<Genre> Genres { get; set; } public virtual ICollection<Keyword> Keywords { get; set; } } 当我有一部需要更新的电影时,就会出现问题:我的数据库会认为正在跟踪的对象以及从update API调用接收到的新对象都是不同的对象,而无视.Equals()。 这引起了一个问题,因为当我现在尝试使用更新的影片来更新数据库时,它将插入数据库而不是更新现有的影片。 我以前在语言方面遇到过这个问题,我的解决方案是搜索附加的语言对象,将它们与上下文分离,将其PK移至更新的对象,然后将其附加到上下文。当SaveChanges()正在执行,它将基本上取代它。 这是一种很臭的方法,因为如果我继续对Movie对象使用这种方法,则意味着我必须分离电影,语言,流派和关键字,在数据库中查找每个人,传输其ID并插入新对象。 有没有办法更优雅地做到这一点?理想情况下,我只想将更新的影片传递给上下文,并让该影片根据该Equals()方法选择正确的影片进行更新,更新其所有字段并针对每个复杂对象:根据其自己的Equals()方法再次使用现有记录,并插入它尚不存在。 我可以通过.Update()在每个复杂对象上提供方法来跳过分离/附加,可以结合使用这些方法来检索所有附加对象,但这仍然需要我检索每个现有对象然后进行更新。

2
从链接列表中删除项目的正确方法
在本次Slashdot采访中,引用了Linus Torvalds的话: 我见过太多的人通过跟踪“上一个”条目来删除单链接列表条目,然后删除该条目,例如 如果(prev) prev-> next = entry-> next; 否则 list_head = entry-> next; 每当我看到这样的代码时,我都会说“这个人不理解指针”。可悲的是,这很普遍。 理解指针的人只使用“指向入口指针的指针”,并使用list_head的地址对其进行初始化。然后,当他们遍历列表时,只需执行“ * pp = entry-> next”,就可以删除条目而无需使用任何条件。 自从十年前在大学中介绍C以来,作为PHP开发人员,我从未碰过任何东西。但是,我觉得这是我至少应该熟悉的一种情况。Linus在说什么?老实说,如果我被要求实现一个链表并删除一个项目,那么上面的“错误”方法就是我要解决的方法。我需要了解Linus所说的最佳代码吗? 我在这里而不是在Stack Overflow上问,因为我在生产代码中实际上没有这个问题。
10 pointers 

2
如何对启发式算法进行单元测试?
假设我们有路线查找算法: def myHeuristicTSP(graph): /*implementation*/ return route 现在我们要对此进行单元测试: class TestMyHeuristicTSP: def testNullGraphRaiseValueError(self): self.assertRaises(ValueError, myHueristicTSP(None)) def testSimpleTwoNodeGraphReturnsRoute: self.assertEquals(expectedResult, myHeuristicTSP(input)) 问题是,对于非启发式TSP算法,我们可以给出各种图形,并检查它们是否始终返回绝对最短的路线。 但是因为启发式算法虽然仍然是确定性的,但它的可预测性较差,仅是为了了解该算法的工作原理并找到那些极端情况?

2
因为GCC是用C ++本身编写的,所以没有鸡和蛋的问题吗?
从4.8版本开始,C ++编译器GCC(它的G ++部分)不再用C编写,而是用C ++本身编写。我对此有一个假设的问题。 我想知道如何在还没有C ++编译器的新平台上编译GCC的C ++代码。当然,您可以使用在其他计算机上编译的预构建二进制文件。或者,您可以使用用C编写的旧版GCC,然后使用它编译当前版本。 但是,如果没有预构建的二进制文件,而只有最新版本,您就会陷入困境,对吗?如果没有,那么从GCC项目的C转换为C ++会对这种情况产生其他影响吗?
10 c++  compiler  gcc 

2
事件的发送者是否应该始终是通用对象?
使用C#编写事件时,建议以以下形式创建委托: delegate XEventHandler(object sender, XEventArgs e); 我的问题是关于代表的第一个论点object sender。一定要一定要通用object吗?具有类型的发送方object总是会导致与此类似的代码。 val = ((ConcreteType)sender).Property; 或者,甚至更冗长, ConcreteType obj = sender as ConcreteType if (obj != null) { ... } 反对强类型发送者的一种说法是,其他对象可以转发事件而不必担心类型。尽管这在GUI环境中可能有意义,但是我不确定它是否可以在GUI之外受益。 如果始终知道发送方的类(至少是抽象类)怎么办?例如,如果我实现ListChanged的一个抽象事件List类,而如果其他类要继承它(例如LinkedList,ArrayList),是这一切的权利界定与类型的发件人我的委托List? delegate ListChangedEventHander(List sender, ListChangedEventArgs e); 还是将常规object sender类型更改为更特定的类型会有不利影响?
10 c#  event 

3
带有度数参数的trig函数何时应返回-0.0?
在创建三角函数my_sind(d),my_cosd(d),my_tand(d),即使用了度参数,而不是一个弧度一个以90的倍数提供确切的答案,我注意到,结果是有时-0.0不是0.0。 my_sind( 0.0) --> 0.0 my_sind(-0.0) --> -0.0 my_sind(180.0) --> -0.0 my_sind(360.0) --> 0.0 sin()并且tan()通常会针对给定的零符号输入返回相同的零符号结果。my_sin()应该sin()为这些输入匹配才有意义。 my_sind( 0.0) alike sin( 0.0) --> 0.0 my_sind(-0.0) alike sin(-0.0) --> -0.0 现在的问题是:什么整数non_zero_n应/可将结果再回到-0.0为my_sind(180*non_zero_n),my_cosd(180*n + 180),my_tand(180*non_zero_n)? 编写代码很容易,因此只需f(-0.0)生成-0.0并完成即可。简单地想知道是否有任何理由使任何其他 f(x)回报-0.0(非零),x以及确保该符号的重要性。 注:这是不是为什么的问题0.0与-0.0发生。这不是为什么cos(machine_pi/4)不回来0.0。这也不是如何控制0.0或的生成的问题-0.0。我将其视为设计问题是最好的。
10 c  math 

1
Groovy中的特性,继承和接口,何时使用?
我正在学习groovy,我刚刚了解了2.3中添加的新功能,即Traits的添加。现在对我来说,特质似乎可以让您完成超类和接口可以做的所有事情。 在Groovy中添加特性会否使继承和接口过时? 如果不是,那么使用这些机制的最佳时间是什么?

3
C ++:使用编译器API而不是C ++功能进行元编程
这最初是一个SO问题,但我意识到这是非常不合常规的,并且根据网站上的实际描述,它可能更适合程序员。因为该问题在概念上具有很大的分量。 我一直在学习clang LibTooling,它是一个非常强大的工具,能够以友好的方式(即以语义的方式,而不是通过猜测)公开代码的整个“坚韧不拔” 。如果clang可以编译您的代码,则clang 可以确定该代码内每个字符的语义。 现在让我退一步。 当人们从事C ++模板元编程时(特别是当冒险超越模板进入聪明的领域,尽管使人恐惧)时,会出现许多实际问题。老实说,对于包括我自己在内的许多程序员而言,模板的许多常规用法也有些令人恐惧。 我想一个很好的例子就是编译时字符串。这是一个已经存在一年多的问题了,但是很显然,到目前为止,C ++对于普通人来说并不容易。尽管看这些选项还不足以引起我的恶心,但我仍然对能够产生神奇的,最高效率的机器代码以适应我的软件中任何花哨的应用程序没有信心。 我的意思是,让我们面对现实吧,伙计们,琴弦非常简单和基本。我们中的某些人只是想要一种便捷的方法来发出带有某些字符串的机器代码,而这些字符串在某些情况下“嵌入”了比直接编写代码时要多得多。在我们的C ++代码中。 输入clang和LibTooling,这将公开源代码的抽象语法树(AST),并允许简单的自定义C ++应用程序正确正确地操作原始源代码(使用Rewriter)以及AST中所有对象的丰富的面向对象的语义模型。它处理很多事情。它了解宏扩展,并让您遵循这些链。是的,我说的是源代码到源代码的转换或翻译。 我在这里的基本论点是,使用clang,现在我们可以创建可执行文件,这些可执行文件本身可以用作C ++软件的理想自定义预处理程序阶段,并且可以使用C ++实现这些元编程阶段。我们仅受以下事实的约束:该阶段必须接受有效的C ++代码的输入,并产生更多有效的C ++代码作为输出。加上您的构建系统适用的任何其他限制。 输入至少必须非常接近有效的C ++代码,因为毕竟clang是编译器的前端,而我们只是在四处寻找并利用其API发挥创意。我不知道是否有任何规定可以定义要使用的新语法,但是显然我们必须开发一种方法来正确解析它并将其添加到clang项目中。期望更多的是在clang项目中超出范围。 没问题 我可以想象一些无操作宏函数可以处理此任务。 查看我正在描述的另一种方法是通过运行我们的源代码的AST(感谢clang及其API)来使用运行时C ++实现元编程构造,而不是使用语言本身可用的更有限的工具来实现它们。这也具有明显的编译性能优势(繁重的模板头与您使用它们的频率成比例地减慢了编译速度。然后,许多已编译的东西被链接器仔细地匹配并丢弃了)。 但是,这样做的代价是在构建过程中引入了额外的一两个步骤,并且还要求(当然)编写一些更详细的软件(但至少是简单的运行时C ++)作为我们工具的一部分。 那不是全部。我非常确定,生成核心语言功能极其困难或不可能的代码可以提供更大的功能空间。在C ++中,您可以编写模板,宏或两者的疯狂组合,但是在clang工具中,您可以在运行时以C ++可以实现的任何方式修改类和函数,同时可以完全访问语义内容,除了模板和宏以及其他所有内容。 因此,我想知道为什么每个人都还没有这样做。是不是来自clang的此功能如此新,并且没人熟悉clang的AST的巨大类层次结构?那不可能。 也许我只是低估了这一点的难度,但是使用clang工具执行“编译时字符串操作”几乎在犯罪上很简单。它很冗长,但是非常简单。所需要的只是一堆无操作宏函数,它们映射到实际的实际std::string操作。clang插件通过获取所有相关的无操作宏调用来实现此目的,并使用字符串执行操作。然后将该工具作为构建过程的一部分插入。在构建过程中,这些无操作宏函数调用会自动评估为其结果,然后作为纯旧的编译时字符串插入到程序中。然后可以照常编译该程序。实际上,结果是该程序的移植性也大大提高,不需要新的支持C ++ 11的编译器。

5
什么时候将API视为嵌入式DSL?
API和嵌入式领域特定语言(DSL)有什么区别? 只是语法吗? 考虑像OpenGL这样的API。与图形DSL有何不同? 换句话说,如果API足够复杂,是否可以将其视为嵌入式DSL?
10 api  dsl 

1
在delphi Pascal中实现MVVM和MVC的最佳实践
我是一个Delphi Pascal程序员,我使用最新的Embarcadero delphi XE,并且想利用诸如模型视图控制器和模型视图视图模型之类的设计模式。 但是,关于在Pascal上执行此操作的最佳做​​法,在网络上似乎没有很多。我可以找到的大多数示例都在C#中,并且某些语言功能在pascal中不存在,这意味着我可能必须找到实现这些功能的方法。 我正在尝试从此处修改本文的代码 我将列出我面临的问题 可空类型 Pascal不像C#那样具有可为空的类型,因此我创建了自己的类型。 TNullable<T> = record strict private fHasValue : boolean; fValue : T; function GetValue:T; procedure SetValue(newValue : T); public property HasValue : boolean read fHasValue; property Value : T read GetValue write SetValue; procedure SetToNull; end; 在实施部分 function TNullable<T>.GetValue:T; begin if fHasValue …


2
要存储库还是不存储库
当我第一次了解域驱动设计时,我还被介绍到了存储库和工作单元模式,这些存储模式和工作单元曾经看起来像是那些酷炫的孩子向数据库发送SQL查询(例如穴居人)的最佳选择。我对这个话题的了解越深,我越了解到它们似乎不再是必需的了,因为EF和NHibernate之类的ORM将工作单元和存储库都实现到一个称为会话或上下文的API中。 现在我不确定该怎么办。是否存储库。我真的很理解这样的论点,即这样的泄漏抽象只会使事情复杂化,而绝对没有增加任何可以简化数据访问的内容,但是,将我的应用程序的各个方面都耦合到例如Entity Framework的感觉并不正确。通常,我遵循一些简单的准则: 域层是系统的核心,包含实体,服务,存储库... 基础结构层提供基础结构领域的域接口的实现,例如文件,数据库,协议。 应用程序层承载一个组合根,该根将所有事物连接起来并进行编排。 我的解决方案通常如下所示: Domain.Module1 Domain.Module2 IModule2Repo IModule2Service Module2 Infrastructure.Persistence Repositories EntityFrameworkRepositoryBase MyApp Boostrapper -> inject EntityFrameworkRepositoryBase into IRepository etc. 我使用a保持域层整洁,IRepository<'T>这也是一个域问题,不依赖于任何其他告诉我如何访问数据的内容。当我现在要实现IModule2Service需要数据访问的具体实现时,我将不得不注入DbContext并将其直接耦合到基础架构层。(要进入Visual Studio项目,由于循环依赖关系,最终可能会非常棘手!) 另外有什么可以到其他托管和作品fucktons?CQRS?如何抽象一个纯粹的基础架构?

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.