首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clean Code:从web服务获取数据时的SRP和Open/Closed

Clean Code:从web服务获取数据时的SRP和Open/Closed
EN

Stack Overflow用户
提问于 2016-04-14 19:10:00
回答 1查看 128关注 0票数 4

当我进行开发时,我通常会尝试遵循SOLID原则。通常,您有一个接口,所有受影响的类都会实现该接口,然后在进行进一步计算时将该接口用作参数。

我的问题是,在调用web服务时,如何实现这一点?下面的代码不是很精简,也不符合单一责任模式和开放/关闭原则。

如何重新设计以下代码以遵循SRP和O/C:

代码语言:javascript
复制
    public class Fetch
    {
        public void Run()
        {
            var url = "https://api.nasa.gov/planetary/apod?api_key=NNKOjkoul8n1CH18TWA9gwngW1s1SmjESPjNoUFo";
            var client = new HttpClient();
            var response = client.GetAsync(url).Result;
            var data = response.Content.ReadAsStringAsync().Result;
            var parsedData = JsonConvert.DeserializeObject<Nasa>(data);

            if(parsedData.media_type.Equals("image"))
            {
                CreateImage(parsedData);
            }

            if (parsedData.media_type.Equals("video"))
            {
                CreateVideo(parsedData);
            }

            if (parsedData.media_type.Equals("text"))
            {
                CreateText(parsedData);
            }
        }
    }

    public class Nasa
    {
        public string copyright { get; set; }
        public string date { get; set; }
        public string explanation { get; set; }
        public string hdurl { get; set; }
        public string media_type { get; set; }
        public string service_version { get; set; }
        public string title { get; set; }
        public string url { get; set; }
    }

( Api密钥取自美国国家航空航天局的示例站点,所以不用担心它会暴露出来。使用.Result的异步部分仅用于此示例)

EN

回答 1

Stack Overflow用户

发布于 2016-04-14 19:42:08

在不太了解您的需求或CreateVideo(item)CreateImage(item)如何工作的情况下,您可以将此作为起点。

请注意,如果您正在使用依赖项容器(如Simple Injector,我喜欢它!)以下内容中的大部分依赖项都可以由容器提供。

代码语言:javascript
复制
public class Nasa
{
    public string copyright { get; set; }
    public string date { get; set; }
    public string explanation { get; set; }
    public string hdurl { get; set; }
    public string media_type { get; set; }
    public string service_version { get; set; }
    public string title { get; set; }
    public string url { get; set; }
}

public interface ITransformFetch<in T>
{
    void Transform(T data);
}

public interface IFetch<T> 
{
    T Fetch();
}

public class NasaFetcher : IFetch<Nasa>
{
    private const string NasaUrl = "https://api.nasa.gov/planetary/apod?api_key=NNKOjkoul8n1CH18TWA9gwngW1s1SmjESPjNoUFo";

    private readonly IHttpClientWrapper _client;

    public NasaFetcher(IHttpClientWrapper client)
    {
        _clientFactory = client;
    }

    public Nasa Fetch()
    {
        var response = _client.GetAsync(NasaUrl).Result;
        var data = response.Content.ReadAsStringAsync().Result;
        return JsonConvert.DeserializeObject<Nasa>(data);
    }
}

public class NasaFetchImageTransformer : ITransformFetch<Nasa>
{
    public void Transform(Nasa data)
    {
        // transform data
    }
}

public class NasaFetchVideoTransformer : ITransformFetch<Nasa>
{
    public void Transform(Nasa data)
    {
        // transform data
    }
}

public class NasaFetcherTransformerDecorator : IFetch<Nasa>
{
    private readonly IFetch<Nasa> _fetcher;

    public NasaFetcherTransformerDecorator(IFetch<Nasa> fetcher)
    {
        _fetcher = fetcher;
    }

    public Nasa Fetch()
    {
        var result = _fetcher.Fetch();
        if (result != null)
        {
            switch (result.media_type)
            {
                case "image":
                    var nasaFetchImageTransformer = new NasaFetchImageTransformer();
                    nasaFetchImageTransformer.Transform(result);
                    break;

                case "video":
                    var nasaFetchVideoTransformer = new NasaFetchVideoTransformer();
                    nasaFetchVideoTransformer.Transform(result);
                    break;
            }
        }

        return result;
    }
}

public class Test
{
    public void TestNasaFetcher()
    {
        var data = new NasaFetcherTransformerDecorator(new NasaFetcher(new HttpClientWrapper()));
        var nasa = data.Fetch();
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36621315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档