跨平台代码组织

Cross Platform Code Organisation

本文关键字:代码 跨平台      更新时间:2023-10-16

我有这个监视器类,它允许使用静态函数访问自身的实例。当调用GetMonitor时,搜索mMonitors映射并返回实例,如果实例不存在,则创建实例。

class Monitor {
    public:
        static Monitor& GetPrimaryMonitor();
        static Monitor& GetMonitor(int number = 0);
        int GetXResolution();
        int GetYResolution();
        void SetXResolution(int resolution);
        void SetYResolution(int resolution);
    protected:
    private:
        Monitor(int number);
        static std::map<int, Monitor*> mMonitors;
};

我的问题是,我应该在什么时候删除地图中持有的Monitor实例?还是应该采用另一种方法,允许用户创建他/她想要的任意数量的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法提供了对已经可用的共享资源的访问。先谢谢你了

我是否应该采用另一种方法,允许用户创建他/她想要的任意多的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法允许访问已经可用的共享资源

是的,你绝对应该。原因如下:

  • 您正在向用户提供监视器的抽象,而不是真正的物理监视器。因此,拥有与实际物理监视器不同数量的监视器对象并不一定是错误的。
  • 不同的用户可能有不同数量的监视器
  • 人们可能有"虚拟"监视器,或者可能有模拟实现用于测试,它们根本不对应于物理监视器。

我建议远离单例,特别是如果它们是用静态实现的。这种模式的含义一开始并不明显,但可能会使事情变得复杂(例如,如果您有多个二进制文件,dll,关心特定的销毁顺序等)。

你应该试着看看你是否可以重新设计一些东西,以便这个Monitor实例可以在代码中传递(某种依赖注入),而不是作为一个单例(在OO中最被滥用的模式,真的)。

您不需要删除监视器的实例(考虑到您不会有那么多监视器设备连接到您的系统,这不会是一个问题)。但如果你真的想这样做,你可以在他们各自的设备断开连接后立即删除他们。

对于实例的创建,您可以使用相同的方法。您可以实例化一个新对象,当用户要求(1)或者当一个新的监控设备连接(2)。如果可以监控设备连接到系统,但您的应用程序的上下文中对它什么都不做我就去(1)。另一方面,如果每次一个新的应用程序监控设备连接到系统,说,需要设备的分辨率,和(2)我就去。

无论哪种方式,都要保持一致,明确他们应该做什么。

监视器的数量是否改变过?

如果没有,我会说你最好保持一个版本并保持所有权。不要让或让用户毁掉它们。

如果是,返回一个共享/自动指针或一些可复制的东西。我怀疑后者是正确的选择,除非创建和销毁对内部的引用非常昂贵。这只是推测。

main中的Init/Cleanup函数并不漂亮或优雅,但它们是有效的,并且非常直接地传达了您的意图。

另一个(在我看来,更好的)选择是根本不返回对象。只需暴露带有监视索引的静态函数:

size_t GetNumMonitors();
void GetMonitorSize(size_t idx, int &x, int &y);
void SetMonitorSize(size_t idx, int x, int y);

如果你真的想要对象设计,把它隐藏在这个(或类似的)接口后面。