ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OOP设计问题:容器或容器中的责任?

2019-12-08 12:06:45  阅读:129  来源: 互联网

标签:oop class-design c c-4


我专注于使软件设计灵活可靠,而实现这一目标的关键概念之一就是封装.
最近,我遇到了一个特殊的设计问题,我不能(和我自己)争论最好的解决方案是什么.

举例说明问题的具体示例:设备具有地址(在总线上).该设备具有多个寄存器.寄存器还具有一个地址(在设备内部-亦称虚拟地址/映射地址),因此例如要写入设备上的寄存器,必须将(registerAddress,值)写入设备的地址.
我无法决定将读/写寄存器的功能放在哪里:

1)寄存器应该能够读写自身,这意味着它需要了解设备与其自身之间的通信通道.这似乎有些奇怪/错误,但我无法解释原因.

2)设备对寄存器进行读/写操作.寄存器只是设备可查询/更改的信息(数据,访问权限等)的占位符.这似乎也是错误的,因为读/写寄存器的责任实际上应该在寄存器中(就像文件知道如何读/写自身一样).

哪种解决方案最有意义,为什么?也许有一个完全不同的解决方案更有意义?

解决方案1

class Device
{
    private CommChan chan;
    private Register register1;
    private Register register2;
    ...

    public Device(int deviceAddress)
    {
        chan = new CommChan(deviceAddress);
        register1 = new Register(0x01, chan);
        ...
    }

    public void DoSomething()
    {
        register1.Write(0x22);
        byte b = register1.Read();
    }
}

class Register
{
    private int address;

    ...

    public Read()
    {
        chan.InitTransfer(address)
        ... // Other setup
        return chan.Read(address);
    }

    public Write()
    {
        chan.InitTransfer(address)
        ... // Other setup
        chan.Write(value);
    }
}

解决方案2

class Device
{
    private CommChan chan;

    public Device(int address)
    {
        chan = new CommChan(address);
    }

    public void DoSomething()
    {
        WriteRegister(0x01, 0x22);
        byte b = ReadRegister(0x01);
    }

    private byte ReadRegister(int address)
    {
        chan.InitTransfer(address)
        ... // Other setup
        return chan.Read(address);
    }

    private void WriteRegister(int address, int value)
    {
        chan.InitTransfer(address)
        ... // Other setup
        chan.Write(value);
    }
}

解决方法:

逻辑驱动,总线本身就是一个对象.读取或写入寄存器是总线操作,不同的总线具有不同的访问寄存器的方式.使用方法ReadRegister和WriteRegister创建总线接口.

这样做绝对是一个考虑因素,我想您曾经在另一种类型的总线上运行此代码的几率很小.

标签:oop,class-design,c,c-4
来源: https://codeday.me/bug/20191208/2091447.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有