#34;标记容器的良好解决方案"?

时间:2017-02-27 11:23:53

标签: types software-design bitmask

在我的问题中,我有一组不同的类型,并且这些类型有Holder(或者如果您喜欢该术语,则为Container)类。每个Holder都可以与任何类型的元素相关联,但具有任意限制。

问题是类型的结构可能非常复杂,我可以有A1,A2,A3,B1,B2这样的子类型,但有一些不同的行为。

例如,我可以拥有一个类Car和一个子类型Convertible,另一个类Helicopter具有Apache子类型,并使一个容器能够关联只有这两种特定类型。 CarHelicopter都将来自同一个父类(Vehicle,后面的示例)。

这不是一个真正的问题本身,但我想让它变得灵活和可维护。这些类型不是硬编码的,而是来自易于生成和读取的配置文件;配置Holders应该像A1 | B3 | C2一样简单。因此,我没有找到灵活性和可用性之间的最佳点。

必须有一些解决方案甚至是模式。想一下比特面具,但我没有经验,我不知道使用它们的最佳方式。

你知道这个具体问题的一些好方法吗?

1 个答案:

答案 0 :(得分:0)

我最终创建了一个Manager,它存储不同的类型,并将其相应的ID作为unsigned int。我的软件并不关心用户定义的任意标签,因此每个标签组合的单个数字就可以了。我们可以将类型视为每个元素所具有的类型列表的抽象。

我的经理为每个标签组合分配一个ID,因此如果您将相同的标签放两次,则会得到相同的结果。然后,整数比任何类型的列表更容易比较。

与我正在考虑的其他选项相比,它的使用和实施也更简单。

这里你有一个我做过的C#原型,它可能不是确定的,但你明白了:

      var objectPageLayout = new sap.uxap.ObjectPageLayout({
                useIconTabBar: true,
                //showAnchorBar:false,
                showAnchorBarPopover: false,
               // enableLazyLoading: true,
                upperCaseAnchorBar: false,
                selectedSection: selectedSectionId,
                navigate: [oController.onSectionChange, oController]
            });
         objectPageLayout.bindAggregation("sections", oController.modelName   + ">/SECTN", function (sId, oContext) {
                var contextObject = oContext.getObject(), currentTab, preparePanelContent = false;
                currentTab = oController.getQueryParam("tab") || "";

                preparePanelContent = currentTab === "" && _.findIndex(oController.getSections(), contextObject) === 0;
                if (!preparePanelContent) {
                    preparePanelContent = currentTab === contextObject['SECTN'];
                }
                    var objectPageSection = new sap.uxap.ObjectPageSection({
                        id: oController.createId(contextObject['SECTN']),
                        title: contextObject['DESCR'],
                        visible: contextObject['HDSCT'] === ''
                    }).data("id", contextObject['SECTN']);

                   if(preparePanelContent)
                      {
                    //showPanelContent returns my blockcontent. 
                    var subSection = new sap.uxap.ObjectPageSubSection({
                      blocks: oController.sectionRef[contextObject['SECTN']]
                           });
                  objectPageSection.addSubSection(subSection);
                      }
                return objectPageSection;
            });