1

任务:我正在设计一个供开发人员使用的库。

目标:我需要确保未来版本中的更改不会影响现有开发人员。

例子:

第一次发布时的情况:

有一类

public class ClassSample

{

String methodSample(String para1,String Para2, int Para3, String Para4);

}

第二次发布时的情况:

要求:

methodSample 的响应可以返回多个值。

methodSample 方法中需要更多参数。

解决方案:一种方法是添加另一个重载方法,该方法将具有新参数并返回对象而不是内置数据类型。

但是上述方案的问题是,以后重载的方法太多,参数太多会矫枉过正。

修改方案一:

void methodSample(Request request, Response response)

在每个版本中(显然,如果需要),我将修改请求和响应类以具有新的附加方法来获取/设置值。在这种情况下会出现问题,因为在方法内部,我将无法区分调用者是 Version10 还是 Version20。

修改后的解决方案 2:

void methodSample(AbsractRequest request, AbstractResponse response)

在每个版本中,我们都可以扩展派生类,例如 Request200 extends Request100 extends AbstractRequest,响应类类似。在这种情况下,我可以通过检查实例类型来检查方法内部调用者是 Version10 还是 Version20。

总而言之,修改后的解决方案 2 对我来说看起来不错,您的想法呢?

4

2 回答 2

1

我会选择修改后的解决方案 1,但在类中添加了一个 get/set Version 方法。

您的库可以使用 getVersion 找出用户程序期望的行为

于 2011-04-18T09:00:16.390 回答
1

我意识到这可能有点晚了,但认为可能对您或其他人有用。

我过去创建了一个需要版本控制的 SDK,并且做了一些与我在下面发布的内容非常相似的事情,而且效果很好。

想法是所有消息都从您建议的抽象类派生,但是一开始就在调用应用程序中设置了一个静态。然后,所有请求只需将 Version 属性设置为与静态属性相同。这样,它在整个应用程序中只指定一次。

添加新版本时,只需添加到枚举中。我实际上使用了一个整数并增加了它,但我认为 Enum 总是更易于维护。

享受!

namespace SilverlightClassLibrary1
{
    public enum SDKVersions
    {
        NonSpecific = 0,
        Version100,
        Version200,
    }

    public abstract class RequestBase
    {
        public static SDKVersions SystemSDKVersion { get; set; }

        public SDKVersions RequestSDKVersion { get; set; }

        protected RequestBase()
        {
            this.RequestSDKVersion = RequestBase.SystemSDKVersion;
        }
    }

    public class SimpleDataRequest : RequestBase
    {
        public String Data { get; set; }
    }

    public class SimpleDataResponse
    {
        public String Response { get; set; }
    }

    public class SomeSDKFunctionality
    {
        public static void RandomSDKFunction(SimpleDataRequest request, out SimpleDataResponse response)
        {
            switch (request.RequestSDKVersion)
            {
                case SDKVersions.Version100:
                    //Legacy response
                    response = new SimpleDataResponse()
                               {
                                   Response = "Helo " + request.Data,
                               };
                    break;

                default:
                    //Fixed / Updated Response
                    response = new SimpleDataResponse()
                               {
                                   Response = "Hello " + request.Data + "!",
                               };
                    break;
            }
        }
    }
}

namespace MyExternalApplication
{
    public class Main
    {
        public void ApplicationEntryPoint()
        {
            //Specify a specific version you intend to use
            RequestBase.SystemSDKVersion = SDKVersions.Version100;

        }

        public void ButtonClickExample()
        {
            SimpleDataResponse response;
            SomeSDKFunctionality.RandomSDKFunction(new SimpleDataRequest()
                                                   {
                                                       Data = "James",
                                                   }, out response);
        }
    }
}
于 2011-08-17T14:22:21.013 回答