我见过ReSharper推荐了很多不幸的是,它不支持Visual Studio中的C++.你能推荐什么吗?我已经使用了Visual Assist,它可以很好地完成它的工作,但与ReSharper相比它非常有限.
有什么建议?
我相信,预处理器指令的使用就像#if UsingNetwork是糟糕的OO实践 - 其他同事则没有.我认为,当使用IoC容器(例如Spring)时,如果相应编程,可以轻松配置组件.在此上下文中任一个属性格式IsUsingNetwork可由IoC容器或设置,如果"使用网络"实现的行为不同,该接口的另一种实现方式应当实现,并注射(例如:IService,ServiceImplementation,NetworkingServiceImplementation).
有人可以提供OO-Gurus的引用或书籍中的参考资料,基本上是"如果你尝试配置应该通过IoC容器配置的行为,那么预处理器使用是不好的OO实践"?
我需要这种引用来说服同事重构......
编辑:我确实知道并同意在编译期间使用预处理程序指令更改目标平台特定代码很好,这就是预处理程序指令的用途.但是,我认为应该使用运行时配置而不是compiletime-configuration来获得良好的设计和可测试的类和组件.换句话说:使用#defines和#if超出它们的意图将导致难以测试代码和设计糟糕的类.
有没有人沿着这些方面阅读一些东西并且可以给我这样我可以参考?
我阅读了ZeroMq指南,我偶然发现了以下内容:
你不能在线程之间共享ØMQ套接字.ØMQ套接字不是线程安全的.从技术上讲,它可以做到这一点,但它需要信号量,锁或互斥量.这将使您的应用程序变得缓慢而脆弱.在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.
后来:
切记:除了创建它们的线程外,不要使用或关闭套接字.
我也明白ZeroMQ Context是线程安全的.
如果一个类在.Net中注册另一个类的事件,则可以从与创建监听器的线程不同的线程调用此事件.
我认为只有两个选项可以从事件处理程序中通过ZeroMQ-Sockets调度:
Socket创建ZeroMQ-的线程Socket/获取现有Socket的ZeroMQ-Context 似乎0MQ-Guide不鼓励第一个,我不认为为每个线程创建一个新的ZeroMq-Socket是高性能/可行的方式.
我的问题:
在事件处理程序中通过0MQ发布消息的正确模式(它的意图是什么)是什么?
此外,该指南的作者在编写时还考虑到.Net的ZeroMQ-Binding:
在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.?
这里有一些示例代码来强调我的问题/问题:
public class ExampleClass
{
public event EventHandler<ByteEventArgs> SomethinIsCalledFromAnotherThread;
}
public class ByteEventArgs : EventArgs
{
public byte[] BytesToSend;
}
public class Dispatcher
{
ZMQ.Context ctx;
public Dispatcher(ZMQ.Context mqcontext, ExampleClass exampleClassInstance)
{
this.ctx = mqcontext;
exampleClassInstance.SomethinIsCalledFromAnotherThread += new EventHandler<ByteEventArgs>(exampleClass_SomethinIsCalledFromAnotherThread);
}
void exampleClass_SomethinIsCalledFromAnotherThread(object sender, ByteEventArgs e)
{
// this method might be called …Run Code Online (Sandbox Code Playgroud) 我正在尝试将应用程序从silverlight移植到wpf.不幸的是,我是两个人的新手.是否与WPF中的以下Silverlight代码等效?
private static Canvas GetCanvas()
{
var uc = Application.Current.RootVisual as UserControl;
if (uc == null)
{
return null;
}
return uc.FindName("ChoiceCanvas") as Canvas;
}
Run Code Online (Sandbox Code Playgroud)
目前我正在使用
Application.Current.MainWindow.FindName("ChoiceCanvas") as Canvas;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,也许是因为ChoiceCanvas位于UserControl而不是MainWindow中?
我目前面临的情况是,我作为测试驱动开发的倡导者必须与模型驱动软件开发(MDSD)/模型驱动架构(MDA)的倡导者竞争.
在我看来,代码生成是我工具箱中的一个有价值的工具,我需要时大量使用模板和自动化.当我认为这有助于理解内部工作或讨论白板上的架构时,我还用UML创建图表.但是,我强烈怀疑通过UML创建软件(创建状态图和序列图以创建工作代码而不仅仅是代码的骨架)对于多层应用程序(数据库层,业务/域层和Gui,甚至可能是分布式的)更有效.在我看来,当谈到MDSD时,CASE工具突然不再仅仅是一种工具,而是满足的要求:一方面,我看到它,
所有这些让我想知道是否有一个成功的故事(产品是及时推出,在变幻无常的时间内,只有少数错误和部分软件已经被重用),以满足现实世界的应用需求.这个creteria并使用严格的模型驱动方法开发:
在MongoDB的驱动教程提示注册类映射到通过自动映射
BsonClassMap.RegisterClassMap<MyClass>();
Run Code Online (Sandbox Code Playgroud)
我想自动化给定命名空间的所有类,而不是为每个类显式写下RegisterClassMap.这目前可能吗?
给出以下示例:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Book" abstract="true">
<xs:sequence>
<xs:element name="titel" type="xs:string">
</xs:element>
<xs:element name="bookCode" type="BookEnum"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Lyric">
<xs:complexContent>
<xs:extension base="Book">
<xs:sequence>
<xs:element name="author" type="xs:string">
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="BookEnum">
<xs:restriction base="xs:int">
<xs:enumeration value="Paperback"/>
<xs:enumeration value="Hardcover"/>
<xs:enumeration value="Liporello"/>
<xs:enumeration value="None"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
抒情来源于书.我想将complexType"Lyric"的BookEnum的可能值限制为"平装".
"无","Liporello"和"精装"不再是"抒情"的有效值.这可以在xsd中完成吗?
下面的代码按预期工作(测试通过)但我想知道如果以这种方式使用迭代器在c ++中被认为是一种不好的做法,或者它是否正常.
也许这是特定的std::vector,其他集合表现不同,最佳实践在集合(甚至他们的实现)之间有所不同?
在其他语言中肯定不行,并且大多数情况下更改集合将使迭代器无效并抛出异常.
BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
std::vector<int> myvector;
for(int i = 0; i < 5; i++)
{
myvector.push_back(i);
}
// is this generally a bad idea to change the vector while iterating?
// is it okay in this specific case?
myvector.reserve(myvector.size() + myvector.size() - 2 );
myvector.insert(myvector.end(), myvector.rbegin() + 1, myvector.rend() -1);
int resultset [8] = { 0,1,2,3,4,3,2,1 };
std::vector<int> resultVector( resultset, resultset + sizeof(resultset)/sizeof(resultset[0]) );
BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(), myvector.end(), resultVector.begin(), resultVector.end());
}
Run Code Online (Sandbox Code Playgroud)
总结问题:
std::vector和其他集合表现不同? …如果我尝试将带有20位主键的数据插入到SQLite数据库中,我会在第二个插入语句中出错,因为它"不是唯一的".如果我从SQLite命令提示中选择我可以看到的值,即主键是用科学计数法编写的.列类型为十进制.是否有办法强制SQLite"按原样"插入值,保持精度/"正常表示",即使值很长?
我读了几个关于通过命令行构建mergemodules的Stackoverflow问题,但当有人建议使用devenv进行编译或使用Dark从现有的msi文件创建wix文件时,所有这些都被接受了.
考虑以下因素:
...如何在没有devenv的情况下从命令行构建合并模块,并且不会失去在visualstudio中为mergemodule解析自动化依赖关系的舒适度?也许有一个我没有找到它的nanttask?
c# ×4
.net ×1
c++ ×1
database ×1
devenv ×1
dos-donts ×1
enumeration ×1
iterator ×1
mda ×1
mdsd ×1
merge-module ×1
mongodb ×1
msbuild ×1
nant ×1
oop ×1
primary-key ×1
resharper ×1
restriction ×1
silverlight ×1
sqlite ×1
stdvector ×1
vdproj ×1
visual-c++ ×1
wpf ×1
xsd ×1
zeromq ×1