首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中避免if-else-if:策略模式策略模式(Policy)总结

Java中避免if-else-if:策略模式策略模式(Policy)总结

作者头像
JarvanMo
发布于 2018-09-06 07:01:56
发布于 2018-09-06 07:01:56
2.4K00
代码可运行
举报
文章被收录于专栏:JarvanMo的IT专栏JarvanMo的IT专栏
运行总次数:0
代码可运行

本文仅仅为入门,高手勿喷。

实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一样,而且 同一家商户的不同充值方式也有所不同,具体系统情况比较复杂,像支付宝既有支付宝账号支付和支付宝网银支付等这些暂时不考虑,为了讲述策略模式这里简单描 述,假如分为四种,手机支付,网银支付,商户账号支付和点卡支付。因为没个支付结算比例不同,所以对手续费低的做一些优惠活动,尽可能让用户使用手续费低 的支付方式来充值,这样降低渠道费用,增加收入,具体优惠政策如下:

网银充值,8.5折 商户充值,9折 手机充值,没有优惠 点卡充值,收取1%的渠道费

作为一个新手的代码基本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Example {
    public Double calRecharge(Double charge ,RechargeTypeEnum type ){
      
       if(type.equals(RechargeTypeEnum.E_BANK)){
           return charge*0.85;
       }else if(type.equals(RechargeTypeEnum.BUSI_ACCOUNTS)){
           return charge*0.90;
       }else if(type.equals(RechargeTypeEnum.MOBILE)){
           return charge;
       }else if(type.equals(RechargeTypeEnum.CARD_RECHARGE)){
           return charge+charge*0.01;
       }else{
           return null;
       }
 
    }
   
} 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum RechargeTypeEnum {
 
    E_BANK(1, "网银"),
   
    BUSI_ACCOUNTS(2, "商户账号"),
   
    MOBILE(3,"手机卡充值"),
   
    CARD_RECHARGE(4,"充值卡")
    ;
   
   
    private int value;
   
   
    private String description;
   
   
   
    private RechargeTypeEnum(int value, String description) {
       this.value = value;
       this.description = description;
    }
      
    public int value() {
       return value;
    }
    public String description() {
       return description;
    }
   
 
    public static RechargeTypeEnum valueOf(int value) {
        for(RechargeTypeEnum type : RechargeTypeEnum.values()) {
            if(type.value() == value) {
                return type;
            }
        }
        return  E_BANK;
    }
}

以上代码虽然实现了基本功能,但是四种计算方式都在一个方法内部,如果优惠模式又增加了几十种,代码会变成什么样?你是否愿意来维护和扩展这样的代码?此时有的同学或许会说,我用switch-case来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Example {
    public Double calRecharge(Double charge ,RechargeTypeEnum type ){
      
      switch(type){
        case RechargeTypeEnum.E_BANK:
            return charge*0.85;
        case RechargeTypeEnum.BUSI_ACCOUNTS:
            return charge*0.90;
        case RechargeTypeEnum.MOBILE:
            return charge;  
        case RechargeTypeEnum.CARD_RECHARGE:
            retrun charge+charge*0.01;
        defaultreturn null;
      }
    
    }
   
} 

这段代码在简洁性确实要比if-else简洁一些,但实际上是换汤不换药,并没有从本质上解决问题。 我们使用if-else事实上也是为了重用,但这只是面向过程的重用,程序员只看到代码重用,因为他看到if-else几种情况下大部分代码都是重复的,只有个别不同,因此使用if-else可以避免重复代码,并且认为这是模板Template模式。我们会从代码运行顺序来看待代码,这种思维类似水管或者串行电路,水沿着水管流动(代码运行次序),当遇到几个分管(子管),就分到这几个分管子在流动,这里就相当于碰到代码的if-else处了。这样的坏处就是,一旦业务发生了变化将给我们维护工作带来极大的困难。 那么有没有更好的实现方式呢?当然有,我们可以通过工厂模式或者策略模式避免如上的面向过程的重用。而本文将要介绍的是 策略模式


策略模式(Policy)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。(Definea family of algorithms,encapsulate each one, andmake them interchangeable. Strategy lets the algorithmvary independently from clients that use it.

UML图如下

sss1.jpg

由上图可看出策略模式由以下角色构成:

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

策略模式让算法独立于使用它的客户而独立变化。策略模式重点是封装不同的算法和行为,不同的场景下可以相互替换。策略模式是开闭原则的体现,开闭原则讲的是一个软件实体应该对扩展开放对修改关 闭。策略模式在新的策略增加时,不会影响其他类的修改,增加了扩展性,也就是对扩展是开放的;对于场景来说,只依赖于抽象,而不依赖于具体实现,所以对修改是关闭的。策略模式的认识可以借助《java与模式》一书中写到诸葛亮的锦囊妙计来学习,在不同的场景下赵云打开不同的锦囊,便化险为夷,锦囊便是抽象策略,具体的锦囊里面的计策便是具体的策略角色,场景就是赵云,变化的处境选择具体策略的条件。

Strategy模式有下面的一些优点:

  1. 相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能。
  2. 提供了可以替换继承关系的办法: 继承提供了另一种支持多种算法或行为的方法。你可以直接生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到 Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类 , 它们之间的唯一差别是它们所使用的算法或行为。 将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
  3. 消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时 ,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。
  4. 实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。

Strategy模式缺点:

1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类: 本模式有一个潜在的缺点,就是一个客户要选择一个合适的Strategy就必须知道这些Strategy到底有何不同。此时可能不得不向客户暴露具体的实现问题。因此仅当这些不同行为变体与客户相关的行为时 , 才需要使用Strategy模式。 2 ) Strategy和Context之间的通信开销 :无论各个ConcreteStrategy实现的算法是简单还是复杂, 它们都共享Strategy定义的接口。因此很可能某些 ConcreteStrategy不会都用到所有通过这个接口传递给它们的信息;简单的 ConcreteStrategy可能不使用其中的任何信息!这就意味着有时Context会创建和初始化一些永远不会用到的参数。如果存在这样问题 , 那么将需要在Strategy和Context之间更进行紧密的耦合。 3 )策略模式将造成产生很多策略类:可以通过使用享元模式在一定程度上减少对象的数量。 增加了对象的数目 Strategy增加了一个应用中的对象的数目。有时你可以将 Strategy实现为可供各Context共享的无状态的对象来减少这一开销。任何其余的状态都由 Context维护。Context在每一次对Strategy对象的请求中都将这个状态传递过去。共享的 Strategy不应在各次调用之间维护状态。

策略模式在实际工作中也很常用,在博客你还在用if-else吗有过很好的阐述,策略模式不仅是继承的代替方案,还能很好地解决if-else问题。下面结合本文之前的例子来说明一下如何使用策略模式。 策略模式下的UML图如下:

sss2.jpg

创建抽象策略角色Strategy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Strategy {
    public Double calRecharge(Double charge ,RechargeTypeEnum type );
}

根据需求,分别实现Strategy即具体策略角色:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class EBankStrategy implements Strategy{

    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
       return charge*0.85;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BusiAcctStrategy implements Strategy{

    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
       return charge*0.90;
    }
    
} 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MobileStrategy implements Strategy {

    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
       return charge;
    }
    
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CardStrategy implements Strategy{
 
    @Override
    public Double calRecharge(Double charge, RechargeTypeEnum type) {
       return charge+charge*0.01;
    }
 }

创建环境角色Context:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Context {
 
    private Strategy strategy;
   
    public Double calRecharge(Double charge, Integer type) {
       strategy = StrategyFactory.getInstance().creator(type);
       return strategy.calRecharge(charge, RechargeTypeEnum.valueOf(type));
    }
 
    public Strategy getStrategy() {
       return strategy;
    }
 
    public void setStrategy(Strategy strategy) {
       this.strategy = strategy;
    }
   
}

StrategyFactory工厂,负责Strategy实例的创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StrategyFactory {
 
    private static StrategyFactory factory = new StrategyFactory();
    private StrategyFactory(){
    }
    private static Map strategyMap = new HashMap<>();
    static{
       strategyMap.put(RechargeTypeEnum.E_BANK.value(), new EBankStrategy());
       strategyMap.put(RechargeTypeEnum.BUSI_ACCOUNTS.value(), new BusiAcctStrategy());
       strategyMap.put(RechargeTypeEnum.MOBILE.value(), new MobileStrategy());
       strategyMap.put(RechargeTypeEnum.CARD_RECHARGE.value(), new CardStrategy());
    }
    public Strategy creator(Integer type){
       return strategyMap.get(type);
    }
    public static StrategyFactory getInstance(){
       return factory;
    }
} 

开始测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
 
    public static void main(String[] args) {
 
       Context context = new Context();
       // 网银充值100 需要付多少
       Double money = context.calRecharge(100D,
              RechargeTypeEnum.E_BANK.value());
       System.out.println(money);
 
       // 商户账户充值100 需要付多少
       Double money2 = context.calRecharge(100D,
              RechargeTypeEnum.BUSI_ACCOUNTS.value());
       System.out.println(money2);
 
       // 手机充值100 需要付多少
       Double money3 = context.calRecharge(100D,
              RechargeTypeEnum.MOBILE.value());
       System.out.println(money3);
 
       // 充值卡充值100 需要付多少
       Double money4 = context.calRecharge(100D,
              RechargeTypeEnum.CARD_RECHARGE.value());
       System.out.println(money4);
    }
 
}

运行结果:

85.0 90.0 100.0 101.0

从上面类图和代码可以看出,策略模式把具体的算法封装到了具体策略角色内部,增强了可扩展性,隐蔽了实现细节;它替代继承来实现,避免了if- else这种不易维护的条件语句。当然我们也可以看到,策略模式由于独立策略实现,使得系统内增加了很多策略类;对客户端来说必须知道兜友哪些具体策略, 而且需要知道选择具体策略的条件。

总结

凡事具有两面性,策略模式也不例外,下面简单列举一下策略模式的优缺点。

优点:
  1. 相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能。
  2. 提供了可以替换继承关系的办法: 继承提供了另一种支持多种算法或行为的方法。你可以直接生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到 Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类 , 它们之间的唯一差别是它们所使用的算法或行为。 将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
  3. 消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时 ,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。
  4. 实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。
缺点:
  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类: 本模式有一个潜在的缺点,就是一个客户要选择一个合适的Strategy就必须知道这些Strategy到底有何不同。此时可能不得不向客户暴露具体的实现问题。因此仅当这些不同行为变体与客户相关的行为时 , 才需要使用Strategy模式。 2 . Strategy和Context之间的通信开销 :无论各个ConcreteStrategy实现的算法是简单还是复杂, 它们都共享Strategy定义的接口。因此很可能某些 ConcreteStrategy不会都用到所有通过这个接口传递给它们的信息;简单的 ConcreteStrategy可能不使用其中的任何信息!这就意味着有时Context会创建和初始化一些永远不会用到的参数。如果存在这样问题 , 那么将需要在Strategy和Context之间更进行紧密的耦合。 3 . 策略模式将造成产生很多策略类:可以通过使用享元模式在一定程度上减少对象的数量。 增加了对象的数目 Strategy增加了一个应用中的对象的数目。有时你可以将 Strategy实现为可供各Context共享的无状态的对象来减少这一开销。任何其余的状态都由 Context维护。Context在每一次对Strategy对象的请求中都将这个状态传递过去。共享的 Strategy不应在各次调用之间维护状态。

最后,是否应该重构一下你的代码了?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
十步零基础JavaScript学习路径
之前写过一篇26天学通前端开发,内容主要讲的就是前端学习路径,今天再来写一篇零基础的JavaScript学习路径,希望能帮编程零基础的前端爱好者指明方向。 开发环境和JavaScript版本问题 一、开发环境和JavaScript版本问题 开发环境越简单越好,一定不要在这个环节浪费时间。 首先说编辑器的选择,sublime text、vs code、atom、webstorm,还有HBuilder。新手入门的时候总想找一个最好的编辑器,其实这编辑器就和游戏里面选英雄一样,没有最厉害的,只有最适合你的,如果还
企鹅号小编
2018/01/30
9810
知乎精选—非科班出身,如何成为程序员?
知乎用户-胡朋 大学学的地理,现在在一家地图导航公司做后台开发(曾经想成为一个前端开发 者),我想说的是,是否科班出生并没那么重要。如果只是想糊口,学一两们语言就足够了,但是想成为一名出色的开发者,有太多需要学的东西了,对非科班出生 的来说,其中最大的不足就是知识结构的不完整,需要一点一点去积累。 我不太会码字,写点我自己的心得。大学从没想过自己会做开发,到毕业那会(2012年)找了好多单位都没人要,恰逢那段时间HTML5被炒的很热, 就想学点这个先找到一个容身之处。把自己关在宿舍两个月,一天看十几个小时的
wangxl
2018/03/08
1.6K0
如何成为一个上流的程序员
除去极少数天赋异禀的神级程序员,我们大部分人都是凡人。 凡人要从一个小菜鸟成长为全栈工程师大神,只能从少到多,慢慢积累知识。这里我推荐采用“先精后广,一专多长”的流程来学习。 先精后广,一转多长 毕业生遇到的第一个问题就是如何在一个城市,甚至是北上广深这样的大城市生存下来。生存下来需要一个稳定的工作,所以需要投一些简历给大公司或者小公司。 平心而论,程序员在市场上的供求关系比绝大部分职业都更有利于求职者,在微博上、twitter上、v2ex上……对优秀程序员的需求从来就没有减少过。优秀的程序员总是能找到工作
程序员互动联盟
2018/03/12
8280
从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(一)
图片来自网络 本人从事JavaWeb开发,应别人要求,思考再三,终决定专门开一贴来总结一下我个人目前推荐的学习路线。从啥也不会到能够从事JavaWeb开发,究竟要学习哪些东西?很多人都会迷茫这个地方。所以我打算随便谈谈我的看法。 我之前一直不想写,因为我知道一旦写了就要承担压力。必然会有一大波人来指责我,说什么什么你这样讲是毒鸡汤,怎能不管算法,不管计算机原理!你这样是误导新人!然后举出一大堆例子,说基础怎么怎么重要,你这样速成将来会有大问题!你这是在瞎扯,一看就知道你不懂得Java的精髓! 我大概能预见
剽悍一小兔
2018/05/17
8990
前端菜鸟是这样入门学习的,点进来!
现在从事IT方向的人有很多。由于Web前端薪资水平高,职业前景广阔,岗位缺口大,就业口径宽,想通过学习Web前端开发从而进入到该行业工作的人越来越多。当然也有很多人在犹豫不知道web前端开发都学哪些内容?零基础的可以学会吗?好不好学.
一墨编程学习
2018/09/14
7270
腾讯 IMWeb 前端团队大招聘,实习应届社招全都要
听说你, 想加入一个专业的前端团队? 想体验一个超大前端团队的团队氛围和前端技术氛围? 想学习一家大公司的开发流程和系统? 想观摩前端技术大牛? 这里统统都有!!! 社招和子公司岗位要求如下,子公司整体会比正式要求低一些。 岗位要求 能够熟练运用 HTML5、CSS3、ES6 构建高性能的 Web 应用程序 熟练使用至少一款主流的 JS 框架(React、Vue、Angular等) 掌握 Node 基础,有开发 Node 服务器的实践经验 熟悉 Web 开发调试技巧,能够熟练运用调试工具,有
用户1097444
2022/06/29
5300
腾讯 IMWeb 前端团队大招聘,实习应届社招全都要
Web前端和Web后端的区分「建议收藏」
一、绪论 1、 前台:呈现给用户的视觉和基本的操作。 后台:用户浏览网页时,我们看不见的后台数据跑动。后台包括前端、后端。 前端:对应我们写的html、css、javascript 等网页语言作用在前端网页。 后端:对应jsp、javaBean、dao层、action层和service层的业务逻辑代码。(包括数据库) 为什么jsp是后端呢?主要是jsp的运行原理是在tomcat服务器运行的。
全栈程序员站长
2022/08/02
1.8K0
为什么前端工程师薪资越来越高?
外媒网站Randstad US收集了目前IT领域各行业的数据,分析了劳动力趋势等数据,预测出在2018年,前端开发是三大最具有就业前景职业之一,而前端开发行业的薪资也会越来越高。
前朝楚水
2018/07/26
5940
为什么前端工程师薪资越来越高?
10年IT编程经验的老司机,和你唠唠前端的发展
本人在IT行业开发了近10年,去过腾讯,创过业,当初的“骗子马云”也成为了中国首富,在中关村“摆摊的刘强东”也娶了奶茶妹妹......而我,┭┮﹏┭┮,还在苦X的做开发,哎,就像伟大的哲学家“谁都不服
程序工场
2018/07/03
9090
聊聊编程语言的选择
大家好,我是鱼皮,今天聊聊编程语言的选择问题,通过对 10+ 主流编程语言的特点、优劣、应用场景、发展前景等简单分析,希望帮还在迷茫的小伙伴们选择最适合自己的语言去学习。
程序员鱼皮
2021/08/23
1.4K0
聊聊编程语言的选择
web前端程序员需要会那些技能?
  黑马程序员为大家分享web前端学习6大技术知识点,希望可以在今后的学习中帮到找到重点,以及学习的主次之分。
用户4104697
2018/12/04
9390
web前端程序员需要会那些技能?
漫谈前端之路
前言 前端之路何其漫漫~ 说明:本篇文章原是写给学弟学妹的,但想来花的功夫确实不少,就把此篇文章当做自己的一个阶段性总结文章了,会保持长期更新。 HTML 总的来说HTML并不难,甚至可以说很无脑……HTML的标签个人觉得过一遍就得,知道什么时候该用什么标签就可以了,因为在以后的开发中打交道最多的就是各种各样的标签,想不熟都难。就像现在我写这篇文章用的Markdown一样,只是几个标签的反复应用。那么html的学习就相对来说很自由了,可以跟着w3schoolW3school网址过一遍标签,网
用户1667431
2018/04/18
1.2K0
测试能力培养之前端调试能力
在现在这个H5流行的时代,作为测试人员不能仅仅依赖UI的反馈来确定问题,掌握前端调试的方法是分层测试技术中的最前端。理解、分析、定位前端工作原理,可以有效的提高测试效率并且准确提交缺陷报告。
TestOps
2022/04/07
5190
最流行的编程语言JavaScript能做什么?
首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言。 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担当不了这个大任。 开始之前,我先说一
Phodal
2018/01/29
2K0
Web前端开发初级阶段需要学习的知识有哪些?
今天来和大家讲讲Web前端开发需要学习什么?前端开发又需要用到哪些开发工具?下面济南IT培训优就业的老师就简单和大家介绍一下。 Web前端工程师其实在不同的公司,有不同的职能,但是称呼都是类似的。 1
企鹅号小编
2018/01/19
9750
Web前端开发初级阶段需要学习的知识有哪些?
关于成为一只体面的前端攻城狮
怎样算是个体面的前端攻城狮? 大概是,PM,设计,开发等工种都觉得你很专业,很腻害吧~ 下面阐述下我心中体面攻城狮该具备的 软件 能熟练使用前端会用的软件。软件主要分为以下几类 IDE 我用的是Su
前端GoGoGo
2018/08/27
5240
给前端新人看的前端之路漫谈
前言 前端之路何其漫漫~ 说明:本篇文章原是写给学弟学妹的,但想来花的功夫确实不少,就把此篇文章当做自己的一个阶段性总结文章了,会保持长期更新。 HTML 总的来说HTML并不难,甚至可以说很无脑……HTML的标签个人觉得过一遍就得,知道什么时候该用什么标签就可以了,因为在以后的开发中打交道最多的就是各种各样的标签,想不熟都难。就像现在我写这篇文章用的Markdown一样,只是几个标签的反复应用。那么html的学习就相对来说很自由了,可以跟着w3schoolW3school网址过一遍标签,网上也有很多其它网
用户1667431
2018/04/18
1.3K0
Node.js是什么?能做什么?终于有人讲明白了
在JavaScript语言努力摆脱“玩具语言”这个标签的进化历程中,Node.js绝对能记下浓墨重彩的一笔。Node.js并不是一个用于实现具体功能的第三方工具库,而是JavaScript程序的运行环境。
IT阅读排行榜
2023/02/13
17.1K0
Node.js是什么?能做什么?终于有人讲明白了
新时代程序员主流开发工具一览
俗话说的好:工欲善其事,必先利其器。一款好的开发工具对程序员来说是至关重要的,可以降低开发成本、提高开发的效率和代码质量。
程序员鱼皮
2021/07/22
1.6K0
学前端有什么好方法,怎么才能更快学会前端?
Web前端是网站的前台部分,运行在浏览器的PC端或移动端,为用户提供浏览网页。目前Web前端技术广泛应用于网站页面制作、微信、手机app开发、休闲游戏制作等场所。
用户7365393
2021/09/19
4330
推荐阅读
相关推荐
十步零基础JavaScript学习路径
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档