小编Pét*_*rök的帖子

如何用IOC替换switch语句,以便我可以保持SOLID原则

我想避免使用switch语句.我有30多种文档类型.还有可能我需要添加更多的文档类型.我宁愿传递IDocument并且具有在IDocument的实现中指定的类型.我忘了提到的其他东西是ProgressNoteViewModel,LabViewModel ...都继承自WorkspaceViewModel,所有具体实现构造函数都将类型IPatient作为参数.我也使用Castle作为我的IoC容器

我想将代码重构为类似的东西

viewModel = new TreeViewModel(repository.GetPatientDocumentListing(IDocumentType);
this.DocTreeViewModel = viewModel;
//How would I then be able to instantiate the right ViewModel
//based on IDocumentType and also pass a object into the
//constructor that is not know at compile time
Run Code Online (Sandbox Code Playgroud)

我有以下代码:

switch (docType)
{
    case "ProgressNotes":
        viewModel = new TreeViewModel(repository.GetPatientProgressNotes());
        this.DocTreeViewModel = viewModel;
        ProgressNoteViewModel workspace = ProgressNoteViewModel.NewProgressNoteViewModel(_patient);
        break;
    case "Labs":
        viewModel = new TreeViewModel(repository.GetPatientLabs());
        this.DocTreeViewModel = viewModel;
        LabViewModel workspace = LabViewModel.NewLabViewModel(_patient);
        break;
}
this.Workspaces.Add(workspace);
this.SetActiveWorkspace(workspace);
Run Code Online (Sandbox Code Playgroud)

c# inversion-of-control switch-statement solid-principles

7
推荐指数
1
解决办法
1769
查看次数

vector <auto_ptr <>>的编译问题

请考虑以下代码:

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

struct A
{
    int a;
    A(int a_):a(a_) {}
};

int main()
{
    vector<auto_ptr<A> > as;
    for (int i = 0; i < 10; i++)
    {
        auto_ptr<A> a(new A(i));
        as.push_back(a);
    }
    for (vector<auto_ptr<A> >::iterator it = as.begin(); it != as.end(); ++it)
        cout << (*it)->a << endl;
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译它时,我从g ++中得到以下模糊的编译器错误:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/proba.d" -MT"src/proba.d" -o"src/proba.o" "../src/proba.cpp"
/usr/include/c++/4.1.2/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp …
Run Code Online (Sandbox Code Playgroud)

c++ stl g++ vector auto-ptr

7
推荐指数
2
解决办法
6179
查看次数

没有必要的标题,我的代码怎么能正确编译?

我使用函数fork(),exec()...

但是如何编译这个程序而不包括一些额外的头文件(比如sys/types.h,sys/wait.h).

我使用ubuntu 10.04和gcc版本4.4.3

#include <stdio.h>
#include <stdlib.h>

int main()
{
 pid_t pid;

 printf("before fork\n");

 pid = fork();

 if(pid == 0)
 {
  /*child*/
  if(execvp("./cpuid", NULL))
  {
   printf("error\n");
   exit(0);
  }
 }
 else
 {
  if(wait(NULL) != -1)
  {
   printf("ok\n");
  }
 }

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

c linux

7
推荐指数
1
解决办法
180
查看次数

我应该将IDE项目文件签入版本控制系统吗?

对于Java项目(由5-10名开发人员组成),我应该将我的IDE项目文件(例如Eclipse或IntelliJ Idea)存储在版本控制系统中(目前我只存储构建脚本)吗?什么是最佳做法?

PS您是否了解根据某些描述符自动为常见Java IDE生成项目文件的工具?

java eclipse ide version-control intellij-idea

7
推荐指数
1
解决办法
1594
查看次数

什么是C++中的::*

当我面对时,我正在阅读基本的C++教程

::*
Run Code Online (Sandbox Code Playgroud)

在以下代码中.我可以知道那是什么:

class A {
public:
protected:
  int i;
};


class B : public A {
  friend void f(A*, B*);
  void g(A*);
};

void f(A* pa, B* pb) {
//  pa->i = 1;
  pb->i = 2;

//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}

void B::g(A* pa) {
//  pa->i = 1;
  i = 2;

//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}

void h(A* pa, B* pb) {
//  pa->i …
Run Code Online (Sandbox Code Playgroud)

c++

7
推荐指数
2
解决办法
8094
查看次数

如何使动态加载的程序集中的设置提供程序可用于反射?

这个问题之后,我在我们正在开发的旧版C#应用程序中成功创建了自定义设置提供程序.它通过SettingsProvider属性引用:

public sealed class MySettings : SettingsProvider
{
    ...
}

[SettingsProvider(typeof(MySettings))]
internal sealed partial class Settings {}
Run Code Online (Sandbox Code Playgroud)

但是,现在我遇到了另一个问题.

我们的客户端应用程序包含一个autoupdate工具,它的实现使得大部分客户端 - 包括上面的类 - 都构建在一个DLL中(我们在这里称之为client.dll),然后由EXE使用.如果需要,EXE首先检查更新并从更新服务器下载最新的更新,用其较新版本(包括client.dll)替换所有DLL等.为了能够在运行时替换DLL,它无法静态链接到它们.所以在更新之后,它加载client.dll并像这样运行它:

Assembly assy = Assembly.LoadFile(
        AppDomain.CurrentDomain.BaseDirectory + "client.dll");
object frm = assy.CreateInstance("Client.Forms.MainForm");
Application.Run((Form)frm);
Run Code Online (Sandbox Code Playgroud)

这样做的不幸结果是框架无法在动态加载的程序集中找到我的自定义设置提供程序类.我尝试使用LoadFrom而不是LoadFile上面但它没有帮助.到目前为止,我发现的唯一可行的解​​决方案是在loader exe中实现一个与真实设置提供程序同名的代理类,框架可以找到它.然后,代理从客户端程序集中实例化实际设置提供程序,并委派对它的所有调用.

这似乎有效但我不满意.有没有办法帮助框架直接在动态加载的程序集中查找我的类?

更新

我收到的错误消息:

System.Configuration.ConfigurationErrorsException: Failed to load provider type: Client.Properties.MySettings, Client, Version=4.0.1341.0, Culture=neutral, PublicKeyToken=null.
   at System.Configuration.ApplicationSettingsBase.get_Initializer()
   at System.Configuration.ApplicationSettingsBase.CreateSetting(PropertyInfo propInfo)
   at System.Configuration.ApplicationSettingsBase.EnsureInitialized()
   at System.Configuration.ApplicationSettingsBase.get_Properties()
   at System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName)
   at System.Configuration.SettingsBase.get_Item(String propertyName) …
Run Code Online (Sandbox Code Playgroud)

c# reflection .net-assembly settingsprovider

7
推荐指数
1
解决办法
1386
查看次数

学习CAD/CAE文件格式的起点?

我们正在大学开发一些压力和应变分析软件.现在是时候从矩形,盒子和球体转移到一些真实的模型.但我仍然不知道从哪里开始.

在我们的软件中,我们将构建网格然后进行计算,但如何从CAD/CAE软件导入实体?

1)CAD/CAE模型的组织方式?如何表示固体?DWG,DXF,IGES,STEP格式有哪些可能性?有一个完整的DXF参考,但是如果不了解基本概念,我就很难理解.

2)是否有C++库从CAD/CAE文件格式导入实体?构建一个完整的模型能够导入综合文件难道不是很难吗?

c++ file-format cad autocad solid-bodies

6
推荐指数
1
解决办法
5872
查看次数

如何在调整大小时强制窗口保持一定的宽度/高度比

我希望我的窗口始终保持一定的比例,比方说1.33333333.因此,如果窗口是width = 800, height = 600并且用户将宽度更改为600,我想自动将高度更改为450.

我已经拦截WM_SIZE但我不知道它是否足够; 我也不知道如何改变宽度或高度以保持我的比例.

c++ winapi

6
推荐指数
1
解决办法
3199
查看次数

谷歌地图算法

如何在Android中集成的Google Maps上实现Dijkstra等算法或回溯?例如,我想计算从A市到B市的路线,这样我就可以支付最低的天然气价格.

algorithm android google-maps

6
推荐指数
1
解决办法
2670
查看次数

为什么在C++中很少使用异常

我已经用C++编程开启和关闭了大约5年,为什么我从未见过除例子以外的例外用例?

c++ exception

6
推荐指数
5
解决办法
2334
查看次数