Questions tagged «implementations»

13
如何警告其他程序员类的实现
我正在编写“必须以特定方式使用”的类(我想所有类都必须...)。 例如,我创建了一个fooManager类,该类需要调用Initialize(string,string)。而且,为了进一步推动该示例,如果我们不听其ThisHappened行为,则该类将无用。 我的意思是,我正在编写的类需要方法调用。但是,如果您不调用这些方法,它将编译得很好,并且最终将得到一个空的新FooManager。在某些时候,根据类及其作用,它要么不起作用,要么崩溃。实现我的类的程序员显然会在其中查找并意识到“哦,我没有调用Initialize!”,这很好。 但是我不喜欢那样。我理想的情况是,如果不调用该方法,则不编译该代码。我猜这根本不可能。或立即可见清晰的事物。 我发现自己对这里的当前方法感到困扰,具体方法如下: 在类中添加一个私有布尔值,并检查类是否已初始化;如果不是,我将抛出一个异常,说“该类尚未初始化,您确定要调用.Initialize(string,string)吗?”。 我对这种方法还可以,但是它会导致很多代码被编译,最终对于最终用户来说是不必要的。 另外,当有更多方法Initiliaze要调用时,有时甚至会有更多的代码。我试图让我的课程没有太多的公共方法/动作,但这并不能解决问题,只是使其合理。 我在这里寻找的是: 我的方法正确吗? 有更好的吗? 你们做什么/建议? 我是否要解决非问题?同事们告诉我,程序员在尝试使用该类之前应先检查该类。我谨对此表示不同意见,但这是我相信的另一件事。 简而言之,我试图找到一种永远不会忘记在以后重用该类或被其他人重用时实现调用的方法。 澄清说明: 要在此处澄清许多问题: 我绝对不仅在谈论类的初始化部分,而且还涉及整个生命周期。防止同事两次调用一个方法,确保他们在Y之前先调用X,以此类推。任何最终成为强制性的要求和文档中的东西,但我希望在代码中尽可能地简化和缩小。我确实很喜欢Asserts的想法,尽管我很确定我将需要混合其他一些想法,因为Asserts并非总是可能的。 我正在使用C#语言!我怎么没提到呢?我在Xamarin环境中,通常在解决方案中使用大约6到9个项目来构建移动应用程序,包括PCL,iOS,Android和Windows项目。我已经从事开发工作大约一年半(包括学校和工作在内),因此有时我会提出荒谬的陈述\问题。所有这一切可能都无关紧要,但是太多的信息并不总是一件坏事。 由于平台的限制和依赖注入的使用,我不能总是将所有必需的东西都放在构造函数中,因为除了Interfaces之外的其他参数都没有了。也许我的知识不足,这很有可能。在大多数情况下,这不是初始化问题,而是更多 我如何确定他注册了该活动? 我如何确保他不会忘记“在某个时候停止该过程” 在这里,我记得一个广告获取类。只要可见“广告”的视图,该类就会每分钟获取一个新广告。该类在构造时需要一个可以显示广告的视图,该视图显然可以包含在参数中。但是,一旦视图消失,必须调用StopFetching()。否则,该类将继续为甚至不在该视图中的视图获取广告,这很糟糕。 同样,该类具有必须被监听的事件,例如“ AdClicked”。如果不听,一切都会很好,但是如果未注册水龙头,我们将失去对分析的跟踪。不过,该广告仍然可以正常运行,因此用户和开发人员不会发现任何差异,并且分析将仅包含错误的数据。需要避免这种情况,但是我不确定开发人员如何知道他们必须注册到tao事件。虽然这是一个简化的示例,但是这里有一个想法,“确保他使用可用的公共动作”,而且当然在正确的时间!

3
为什么Python用C而不是C ++编写?
在Python的教程中,可以看到Python的原始实现是在C中实现的; 另一方面,用C编写的Python实现(...) 我很好奇为什么Python是用C而不是C ++编写的? 我想知道此决定的原因,答案应以历史参考为依据(而非基于观点)。

5
为什么C编译器这么少?
C是世界上使用最广泛的语言之一。它占现有代码的很大一部分,并继续用于大量的新代码。它受到用户的喜爱,它的广泛移植使能够运行C对许多平台的非正式定义而言,并因其是一种具有相对简洁功能的“小型”语言而受到其粉丝的称赞。 那么所有的编译器在哪里? 在桌面上,(实际上)有两个:GCC和Clang。考虑了几秒钟,您可能会记得英特尔也存在。还有很多其他的东西,对于普通人来说实在太晦涩难懂了,几乎没有普遍地去支持最新的语言版本(甚至常常是定义明确的语言子集,只是“子集”)。此列表的一半成员是历史脚注;其余大多数都是非常专业的,实际上还没有实现完整的语言。实际上很少有开源的。 Scheme和Forth-其他深受其迷们喜爱的小语言-可能比实际用户拥有更多的编译器。甚至像SML之类的东西,也要比C有更多“严肃”的实现方式可供选择。而针对验证的新的(未完成的)C编译器的发布实际上看到了一些相当负面的回应,而资深的实现则努力争取足够的贡献者甚至赶上C99。 为什么?实现C这么难吗?不是C ++。用户是否只是对其所属的复杂度组有一个非常歪斜的想法(即实际上它比Scheme更接近C ++)?

6
为什么C#是用不同于Java的“ new”和“ virtual + override”关键字构成的?
在Java中没有virtual,new,override对于方法定义的关键字。因此,方法的工作很容易理解。因为如果DerivedClass扩展BaseClass的和具有相同的名称和它们的签名的方法BaseClass的那么压倒一切将发生在运行时多态性(提供的方法是不是static)。 BaseClass bcdc = new DerivedClass(); bcdc.doSomething() // will invoke DerivedClass's doSomething method. 现在来到C#时,可能会有太多的困惑,并且很难理解newor virtual+derive或new +虚拟重写的工作方式。 我不明白为什么在世界上为什么要在我的方法中添加一个DerivedClass具有相同名称和签名的方法,BaseClass并定义一个新的行为,但是在运行时多态时,BaseClass将调用该方法!(这不是覆盖,但在逻辑上应该覆盖)。 如果virtual + override逻辑实现是正确的,则程序员必须考虑在编码时应允许用户重写的方法。里面有一些有利条件(让我们现在不去那里)。 那么,为什么在C#中有如此大的空间用于非逻辑推理和混乱。所以,我可以重新塑造我的问题是在现实世界方面,我应该考虑使用virtual + override替代new,还可以使用的new,而不是virtual + override? 在获得了特别是Omar的一些非常好的回答之后,我发现C#设计人员更加强调程序员在创建方法之前应该思考的问题,这种方法很好并且可以处理Java中的一些菜鸟错误。 现在我想到一个问题。就像在Java中,如果我有类似的代码 Vehicle vehicle = new Car(); vehicle.accelerate(); 后来我提出新的类SpaceShip衍生Vehicle。然后我想将所有内容更改car为一个SpaceShip对象,而我只需要更改一行代码 Vehicle vehicle = new SpaceShip(); vehicle.accelerate(); 这不会在任何代码点破坏我的任何逻辑。 但是在C#的情况下,如果SpaceShip不覆盖Vehicle类accelerate并使用,new则代码的逻辑将被破坏。这不是不利条件吗?

3
当我们可以在C ++中将接口用于相同目的时,PImpl模式有什么意义?
我看到很多在C ++中使用PImpl惯用语的源代码。我假设它的目的是隐藏私有数据/类型/实现,因此它可以消除依赖关系,然后减少编译时间和标头包含问题。 但是C ++中的interface / pure-abstract类也具有此功能,它们也可以用于隐藏数据/类型/实现。为了让调用者在创建对象时只看到接口,我们可以在接口的头中声明一个工厂方法。 比较为: 费用: 接口方式的成本较低,因为您甚至不需要重复公共包装器函数的实现void Bar::doWork() { return m_impl->doWork(); },您只需要在接口中定义签名即可。 很好理解: 每个C ++开发人员都可以更好地理解接口技术。 性能: 接口方式的性能并不比PImpl成语差,两者都需要额外的内存访问。我认为性能是一样的。 以下是伪代码来说明我的问题: // Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header. class BarImpl; class Bar { public: // public functions void doWork(); private: // You …


2
做REST的正确方法是什么?
如今,每个人都在进行SOA,即使有些人实际上并不了解全部内容。所以他们做错了。以此为类比,我知道REST是什么(或者至少我认为我是这样做的),并且想要做一些。但是我想做对。 所以我的问题是做REST的正确方法是什么?

5
当不需要属性之一时实现接口
很简单。我正在实现一个接口,但是该类没有一个属性是必需的,实际上,不应使用该属性。我最初的想法是做一些类似的事情: int IFoo.Bar { get { raise new NotImplementedException(); } } 我想这本身没有错,但是感觉并不“正确”。有人遇到过类似情况吗?如果是这样,您是如何处理的?

6
通过不缓存结果的方式实现LINQ有什么好处?
对于使用LINQ弄湿脚的人来说,这是一个众所周知的陷阱: public class Program { public static void Main() { IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"}); var newCollection = new List<Record>(originalCollection); Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection)); } private static IEnumerable<Record> GenerateRecords(string[] listOfNames) { return listOfNames.Select(x => new Record(Guid.NewGuid(), x)); } private static bool ContainTheSameSingleObject(IEnumerable<Record> originalCollection, List<Record> newCollection) { return originalCollection.Count() == 1 && newCollection.Count() …

6
作者将接口引用强制转换为任何实现是什么意思?
我目前在试图掌握C#的过程,所以我读通过C#自适应编码由加里·麦克莱恩大厅。 他撰写有关模式和反模式的文章。在实现与接口部分中,他写道: 不熟悉接口编程概念的开发人员通常很难放开接口背后的内容。 在编译时,接口的任何客户端都不应该知道接口正在使用哪种接口实现。这些知识可能导致错误的假设,从而使客户端耦合到接口的特定实现。 想象一下一个常见的示例,其中一个类需要在持久性存储中保存一条记录。为此,它正确地委托给一个接口,该接口隐藏了所使用的持久性存储机制的详细信息。但是,对运行时使用接口的哪个实现进行任何假设都是不正确的。例如,将接口引用强制转换为任何实现都是一个坏主意。 这可能是语言障碍,或者是我缺乏经验,但是我不太明白这意味着什么。这是我的理解: 我有一个免费的有趣的项目来练习C#。我在那里上课: public class SomeClass... 此类在很多地方都使用过。在学习C#时,我读到最好使用接口抽象,因此我做了以下工作 public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have. public class SomeClass : ISomeClass <- Same as before. All implementation here. 因此,我进入了所有一些类引用,并用ISomeClass替换了它们。 除了在构造中,我写过: ISomeClass myClass = new SomeClass(); …

2
实施DDD:用户和权限
我正在研究一个小型应用程序,试图掌握域驱动设计的原理。如果成功,这可能是一个更大项目的试验。我正在尝试遵循《实现域驱动的设计》(由Vaughn Vernon撰写)一书,并试图实现一个类似的简单讨论论坛。我还在github上签出了IDDD示例。我在采用身份和案件访问权方面遇到一些困难。让我给出一些背景信息: 我(希望)理解了将用户和权限逻辑分开的原因:这是一个支持域,并且是一个不同的有界上下文。 在核心域中,没有用户,只有作者,主持人等。这些是通过使用服务延伸到“身份和访问”上下文,然后将接收到的User对象转换为and主持人而创建的。 以相关角色作为参数调用域操作:例如: ModeratePost( ..., moderator); 域对象的方法检查给定的主持人实例是否不为空(如果从“身份和访问”上下文中询问的用户不具有主持人角色,则主持人实例将为空)。 在一种情况下,它会在更改帖子之前进行另一项检查: if (forum.IsModeratedby(moderator)) 我的问题是: 在后一种情况下,安全性关注点是否不会再次混入核心域?以前,这些书指出“可以与谁一起发布主题,或者在允许的条件下发布。论坛只需要知道作者正在这样做”。 本书中基于角色的实现非常简单:当主持人是核心域时,它会尝试将当前的userId转换为主持人实例,或在需要时将其转换为作者。服务将以适当的实例进行响应;如果用户没有所需的角色,则该服务将为null。但是,我看不到如何适应更复杂的安全模型。我正在尝试的当前项目具有一个包含组,ACL等的相当复杂的模型。 即使规则不是很复杂,例如:“帖子只能由其所有者或编辑者编辑”,但这种方法似乎无法使用,或者至少我看不到实现该方法的正确方法。 通过向Identity and Access上下文询问OwnerOrEditor实例并不适合,我最终会在核心域中得到越来越多与安全性相关的类。另外,我不仅需要将userId传递给安全上下文,还需要将受保护资源的标识符(帖子,论坛等的ID)传递给安全性上下文,该上下文可能不关心这些事情(对吗? ) 通过将权限拉到核心域并在域对象的方法或服务中检查它们,我将得出结论:将安全问题与域混合在一起。 我在某个地方读过(并且我倾向于同意),这些与权限相关的事物不应成为核心域的一部分,除非安全性和权限是核心域本身。像上面给出的那样简单的规则是否足以使安全性成为核心域的一部分?

3
ref和out在运行时之间有什么区别?
C#提供ref和out关键字,以使参数通过引用传递。两者的语义非常相似。唯一的区别在于标记变量的初始化: ref要求在将变量传递给函数之前进行初始化,out而不是。 out要求变量在函数内部初始化,ref不需要。 这两个关键字的用例也几乎相同,它们的使用频率太高了,我相信这是代码的味道(尽管有诸如TryParse和TryGetValue模式之类的有效用例)。 因此,有人可以解释一下,为什么C#中有两个非常相似的工具用于如此狭窄的用例? 另外,在MSDN上,它们具有不同的运行时行为: 尽管ref和out关键字导致不同的运行时行为,但在编译时它们不被视为方法签名的一部分。 它们的运行时行为有何不同? 结论 这两个答案看起来都是正确的,谢谢你们。我接受jmoreno是因为它更明确。

4
允许使用显式接口实现在C#中隐藏成员吗?
我知道如何在C#中使用接口和显式接口实现,但是我想知道隐藏某些不经常使用的成员是否被认为是不好的形式。例如: public interface IMyInterface { int SomeValue { get; set; } int AnotherValue { get; set; } bool SomeFlag { get; set; } event EventHandler SomeValueChanged; event EventHandler AnotherValueChanged; event EventHandler SomeFlagChanged; } 我事先知道这些事件虽然有用,但很少使用。因此,我认为通过显式实现将它们隐藏在实现类之外以避免IntelliSense混乱是有意义的。


4
在C ++中组织接口和实现的方法
我已经看到,在C ++中,关于头文件中的内容和cpp文件中的内容有几种不同的范例。AFAIK,大多数人,尤其是具有C背景的人会: foo.h class foo { private: int mem; int bar(); public: foo(); foo(const foo&); foo& operator=(foo); ~foo(); } foo.cpp #include foo.h foo::bar() { return mem; } foo::foo() { mem = 42; } foo::foo(const foo& f) { mem = f.mem; } foo::operator=(foo f) { mem = f.mem; } foo::~foo() {} …
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.