精华内容
下载资源
问答
  • 或者在述职的时候,我们又是否能够很精炼的用分钟时间说清楚项目中是如何使用某种设计模式呢? 今天,我们就用日常交流的话语来总结下GoF的23种设计模式。在设计模式之前,我们需要先了解下设计模式的本质、...

    大家对设计模式都不陌生,在工作中有意无意多少会用到一些设计模式。但是,面对新人,我们是否能够用一分钟时间向他讲解明白一种设计模式呢?或者在述职的时候,我们又是否能够很精炼的用一分钟时间说清楚项目中是如何使用某种设计模式呢?

    今天,我们就用日常交流的话语来总结下GoF的23种设计模式。在讲设计模式之前,我们需要先了解下设计模式的本质、作用、设计原则和分类。

    一、设计模式的本质

    设计模式的本质是面向对象设计原则在实际项目中的运用。

    二、设计模式的意义

    1、对程序员而言:提高思维能力、设计能力;

    2、对项目而言:更加标准化、提高开发效率;

    3、对软件而言:代码高可靠性、高重用性、可读性好。

    三、设计模式的原则

    1、开闭原则:开放扩展、关闭修改;

    2、里氏代换:基类出现的地方,子类也可以出现;(开闭的补充)

    3、依赖倒转:针对接口(抽象类)设计和编程,而不是依赖于具体的是实现类;(开闭的基础)

    4、接口隔离:多个“隔离的接口”比“单个接口”好;

    5、最少知道(迪米特):实体里的元素尽量保持私有

    6、合成服用:组合优于继承

    一句话:开闭是共识,里氏是基础,依赖是补充;其他三个:接口(接口相关)、最少(类相关)、合成(结构相关)

    四、分类

    1、创建型5个(创建对象但隐藏创建逻辑)

    工厂、抽象工厂、单例、建造者、原型

    2、结构型7个(关注类和对象的组合)

    适配器、桥接、过滤器、组合、装饰器、外观、享元、代理

    3、 行为型11个(关注对象间的通信)

    责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、空对象、策略、模板、访问者

    五、一分钟一个设计模式

    (一)创建型

    1、单例(Singleton)模式

    一个类只能生成一个实例。通过构造函数私有,静态方法返回私有静态实例实现单例模式。分“懒汉”和“饿汉”两类,懒汉的实现又有线程安全和不安全的问题。线程安全的实现有synchronized、双重校验锁和静态内部类三种方式。

    2、原型(Prototype)模式

    把一个对象用克隆的方式生成另一个对象,而不是通过new的方式实现。分为浅克隆和深克隆,浅克隆是指克隆的对象的引用类型的属性不克隆,而是指向原对象的属性地址,深克隆相反。

    3、简单工厂(Factory)模式

    不采用通常new的方式生成对象,而是使用一个专门的工厂负责生产对象,这个工厂类一般提供一个静态方法,比如makeProduct,方法的参数是获取对象的类型,直接通过工厂类点makeProduct的方式获取需要的对象。简单工厂生产的产品是统一的抽象产品,方便外部调用者可以提供通用的处理方式。

    工厂方法(Factory Method)模式

    相比简单工厂只是讲产品抽象,工厂方法模式将工厂也抽象化了,不同的产品由不同的具体工厂负责生产。满足了依赖倒置原则,软件设计不依赖于具体的工厂类,使用抽象工厂就可以完成设计。

    4、抽象工厂(AbstractFactory)模式

    工厂方法模式只能生产一类产品,而实际开发中我们需要的可能是一系列关联的产品对象,这就用到了抽象工厂模式。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

    5、建造者(Builder)模式

    建造者模式强调的是把复杂对象的创造分解为多个部分进行创建。创建过程由指挥者Director发起,具体的创建者叫做Builder,它可以创建Prodcut的各个部分。指挥者Direcotor调用Builder创建Product的各个部分,并将各个部分装配成需要的Prodcut。

    一分钟理解6种创建型模式

    这6种模式总体是从一到多的过程:一个对象是“单例”,一个对象复制多个是“原型”,一个工厂生产多个对象是“简单工厂”,多个工厂生产多个单产品是“工厂方法”,多个工厂生产多个产品族是“抽象工厂”,把产品分解为多个部分是“建造者”。

    (二)构造型

    1、代理(Proxy)模式

    为了保护某些类,这里叫做主题类,或者为了使其更好用,不直接使用这些主题类,而是构建了一个代理类。代理类提供了与主题类相同的接口,在代理类内部调用主题类。比如不对数据库连接直接使用,而是将其连接封装到一个代理类里。

    2、适配器(Adapter)模式

    场景是已经存在了一些可用的接口Target,和可用的具体类,但是具体类的却不能直接实现Target接口,导致无法使用。这时就需要创建一个适配器类Adapter,它内部封装具体类,此时叫做适配者类Adaptee,然后把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

    3、桥接(Bridge)模式

    接口继承是子接口继承自父接口,桥接模式使用组合关系代替了继承关系,子接口不再继承自父接口,而是作为父接口的一个属性,子接口定义的一些新属性以这样的方式供父接口使用。这样的好处是在类维度比较多的情况下,可以避免子类过多的问题。这里的父接口叫做抽象化Abstraction,子接口叫做实现化Implementor。

    4、装饰(Decorator)模式

    首先有个构件Component,要给它添加一些职责,可以提供一系列装饰类Decorator。通过装饰类装饰后,我们只希望构件的职责增加,但类型不变,还是原来的构件类型。需要让装饰接口也继承自构件接口,这样在使用的时候,只需要new一个装饰类,同时把构件作为构造函数的参数传递进去,返回的依然是一个可用的构件类型。

     

    5、外观(Facade)模式

    外观就是门面或窗口,不管内部多个子系统多复杂,对外只提供一个统一的外观类。外观类封装了各子系统的功能,对外提供统一的接口。

    6、享元(Flyweight)模式

    一个对象里有些状态是基本不改变的,有些状态会经常改变。把常改变的部分提取出来,叫做非享元,剩下的不改变的抽象成享元,非享元作为享元的一个属性存在。然后,提供一个享元工厂,根据需要它可以提供合适的享元对象,并将非享元传递给享元,让享元具有了合适的完整状态。这样的好处是节省了大量的系统资源。

    7、组合(Composite)模式

    将对象组装成树状层次结构,有树叶构件Leaf和树枝构件Composite的概念,他们都继承自同一个抽象构件Component。树枝可以添加树叶,树叶不行。分为透明和安全两种方式,透明方式是把add、remove等方法定义到Component,用户无需区别树叶和树枝;安全方式是把方法定义到Composite里,但客户需要区分树枝树叶,失去了透明性。

    一分钟理解7种构造型模式

    对已有类进行包装的:代理、装饰、适配器、外观。代理侧重于对现有类的保护和改造,装饰是对现有类职责进行增加,适配器侧重于将现有接口和现有类进行关联适配,外观是对现有子系统的封装。

    对已有类进行组合的:桥接、享元、组合。桥接是用组合替代继承,享元是把经常变化的状态提取出来抽象成为享元对象的非享元属性,组合是树状结构的实现。

    (三)行为型

    1. 模板方法(Template Method)模式

    父类实现算法骨架,而使用到的一些具体的算法子方法可以在子类中实现。这实际上是子类重写了父类的方法,可重写的包括具体方法、抽象方法、钩子方法。

    2. 策略(Strategy)模式

    用户使用某个算法时,这个算法可能会有多种实现方式,可以把这些实现都封装起来作为不同的策略Strategy,而用户使用的还是统一的环境类Context。具体使用时,根据情况把具体的策略提供给环境类,然后调取环境类的计算方法即可。

    3. 命令(Command)模式

    正常使用命令是直接调取对象的方法,但是要把这个命令储存、传递、调用、增加与管理,就需要用到命令模式。命令的使用者叫Invoker,命令的具体执行和实现者叫Receiver,把命令封装到Command就是在Command里实现call方法,call里调取Receiver的action。

    4. 职责链(Chain of Responsibility)模式

    职责链的每个环节叫做处理者Handler,它包含next属性也是一个处理者,每个处理者在执行完请求handleRequest后会自动调取next执行请求handleRequest,实现一种链式方法执行。具体的职责链各个环节的装配由客户类实现。

    5. 状态(State)模式

    一个环境类Context如果有多种状态,并且状态的切换具有一定的条件判断,那么可以采用状态模式。将状态抽象为State,每次环境改变后,把自身作为参数传递给状态State的handle方法,State根据条件改变Context的状态为新的状态。

    6. 观察者(Observer)模式

    当一个对象发生改变后,需要通知其他多个对象进行相应的响应。发生改变的对象叫做主题Subject,它维护了一个抽象观察者Observer的队列observers。需要响应主题的对象只需要实现Observer接口,并添加到observers即可。Subject在需要的时候循环observers依次调取各观察者的响应方法即可。

    7. 中介者(Mediator)模式

    如果多个对象集合中,任意一个对象发生改变后,都想通知其他对象做出响应,可以用中介者模式。这些对象叫做同事类Colleague,还需建一个中介类Mediator,Mediator维护一个同事列表,每个同事对象也会关联到这个中介mediator。当一个同事A发出send后,会通知中介mediator进行转发relay,中介再循环调用A以外的同事队列,使每个同事都receive消息。

    8. 迭代器(Iterator)模式

    提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。使用比较常见,不做详述。

    Iterator it = ag.getIterator();

    while (it.hasNext()){

    Object ob = it.next();

    //do something

    }

    9. 访问者(Visitor)模式

    对于某个复杂的数据结构Object Structure,它包含了一系列的元素Element,而对这些元素的操作方式也不一样并抽象成了访问者Visitor。当数据结构accept一个visitor后,需要让内部的各个元素都accept这个visitor,而元素在accept方法中调取visitor的create方法来实现visitor对元素的操作。

    10. 备忘录(Memento)模式

    有时候需要用到保存和还原的操作,这时就可以使用备忘录模式。发起人Originator可以将当前状态并生成一个备忘录对象Memento,然后调取管理者Caretaker保存备忘录对象。需要还原的时候,发起人再通过管理者获取到已存的备忘录对象,并改变还原当前状态即可。

    11. 解释器(Interpreter)模式

    解释器模式可以实现对特定某些的语法进行解释和处理。需要了解的概念有终结符表达式和非终结符表达式。每个表达式Expression都需要实现特定的解释方法interpret,一般通过递归的方式实现一个复杂语句的解释。

    12. 一分钟理解11种行为型模式

    对方法的覆盖:模板、策略、访问者。模板是子类对父类方法的重写;策略是对环境中关联的策略类进行替换;访问者的数据结构更复杂,需要各子元素实现访问者的访问。

    对方法的传递:命令。将方法封装,实现方法的传递和管理。

    对象状态改变:备忘录。将状态封装,实现状态保存和还原。

    多对象切换:职责链、状态。职责链是多元素按照单链条方式传递,状态是多元素按照有向图结构进行改变。

    多对象遍历:观察、中介、迭代。观察是特定对象通知其它对象,中介是任意一个对象通知其它对象,迭代是遍历所有对象。

     

    展开全文
  • 不过这也是一个比较麻烦的过程,首先学会如何自定义各个项目菜单。然后找到相关功能进行菜单布局设置。在此过程中基本上都放弃了。下面我们简单介绍一下,如何用VBA代码,给鼠标右键添加一个自己定义函数或者过程...

    No.1

    Excel给我们的感觉就是,灵活性比较好,自定义很方便,但是在使用过程当中,或许我们自定义功能用得十分的少,甚至从未用过。

    其实呢,由于Excel太过随意,完全可以设计一个十分修改化的工作界面。

    不过这也是一个比较麻烦的过程,首先学会如何自定义各个项目菜单。

    然后找到相关功能进行菜单布局设置。

    在此过程中基本上都放弃了。

    下面我们简单介绍一下,如何用VBA代码,给鼠标右键添加一个自己定义函数或者过程。

    f28c5646b1450f1015e27cb3343d1201.png

    No.2

    右键也可以自定义,也许不是很熟悉的人,对此也十分陌生。

    但并不会影响我们对此学习的探究。

    Windows有一个好处,就是相对开放且可以自由设置,毕竟盗版系统很多,微软也一直默认这种情况继续下去。

    可能其根本原因是不想失去免费带来的市场占用率,间接带动收费用户增加吧!

    经济上的事情,我们不谈,只讨论如何将自己的工作做好。

    No.3

    接入正题,鼠标左键可以自由添加,其实际意义在于,如果工作当中对于某一个功能操作有十分高的频率,那么鼠标右键弹出快捷功能将是一个十分有用的方法。

    下面就如何增加鼠标左键,做一个简单介绍。

    下图为例,给右键增加一个计算求和功能。

    求和区域就是鼠标所选择的区域。

    以对话框的形式将求和结果输出,如果可以不妨用你想用的方式来进行存储结果。

    2b03b9f89bde5a7e25887ef0a630c41c.png

    左侧列表为鼠标右键所有功能名称,这个功能在第一个按钮实现。

    把所有鼠标右键的功能都显示在第一列中,不同的电脑内容可能不一样,这个随Excel设置来决定。

    No.4

    单击“添加右键菜单”按钮就在鼠标右键里添加了一个功能项目,如下图:

    b2f5e7a4277029375d961a1aafe37fcd.png

    求和计算右键功能就添加进来了,以后对表格进行求和,可以直接右键单击此功能项目就实现求和了。

    添加右键过程

    Sub AddRightCom()    '在单元格鼠标右键快捷菜单中新建一个名为“求和计算”的命令按钮    If CheckComm Then Exit Sub'检测是否已经添加“求各计算”    With Application.CommandBars("Cell").Controls.Add(before:=1)        .Caption = "求和计算"        .OnAction = "test"'要执行的过程名    End WithEnd Sub

    检测是否已经添加“求和计算”

    Function CheckComm() As Boolean '判断按钮是否已经添加    CheckComm = False    Dim com As Object    For Each com In Application.CommandBars("Cell").Controls        If com.Caption = "求和计算" Then            CheckComm = True            Exit For        End If    Next comEnd Function

    这个示例以对话框形式将求和结果显示出来,如果要把求和的值添加到特定位置,还需要进行代码处理。

    求和过程

    Sub test()    MsgBox Application.WorksheetFunction.Sum(Selection)End Sub
    41c03702a66a1cf08690d8ce0997315f.png

    No.5

    本例用到CommandBars对象,以及Add属性。

    代码示例:

    Application.CommandBars("Cell").Controls.Add(before:=1)

    方法

    Application.CommandBars.Controls.add(Name,Position,MenuBar,Temporary)

    4135ea8fd9dc2f4f13ee8e016bb85249.png

    具体使用可查看下面地址:

    https://docs.microsoft.com/zh-cn/office/vba/api/office.commandbars.add

    No.6

    本文主要以添加鼠标右键功能为例,做一个简单介绍,如果想在实际应用中添加自己定义的函数或过程,需要大量的时间去验证,所以此方法推荐有意要对Excel应用操作个性化定制的朋友。

    当然了CommandBars不仅包括鼠标右键,也包括菜单栏、功能栏等等个性化定制功能,大家可以触类旁通、举一反三进行深入学习。

    欢迎关注、收藏

    展开全文
  • 因为不管是在产品研发内部面向项目经理、产品经理、测试经理把复杂的业务逻辑讲清楚,还是将来出门在外向老板汇报、跨公司交流,用简单明了的语言把事情讲清楚,让人听懂,都是项非常重要的能力,值得反复训练;...

    郑昀@云纵 20161227

    一,从演讲者个人的角度来看:

    • 我们新兵的主题演讲要达成两个目的:

      • 学会用简单明了的话把事情说清楚,让外行听明白;

        • 因为不管是在产品研发内部面向项目经理、产品经理、测试经理把复杂的业务逻辑讲清楚,还是将来出门在外向老板汇报、跨公司交流,用简单明了的语言把事情讲清楚,让人听懂,都是一项非常重要的能力,值得反复训练;

      • 学会深度思考问题;

        • 眼光的高度、视野的宽度、思维的深度、职业化的专业程度,每一项都要训练。高度和宽度吧不好一蹴而就。对于新兵来说,深度还是可以操练起来的。逼一逼,大家是能出结果的。

    二,从听众的角度来看:

    • 新兵的主题演讲要达成两个目的:

      • 听众现场期望有所得;

      • 能指导今后的工作,不管你主题多么高大上,最终都要落回到工作实质上:一,未来部门工作得能用的上,二,用的话会遇到哪些坑,如何解决。

    三,什么叫深度思考?

    韩春雨事件中,有科学界的人讲道:

    在学术界,如果你想发表自己的博士论文,那么标准模式是,你需要先整理业界对这个课题的所有探索,不管你是梳理历史脉络也好,梳理有多少种理论也好,总之你的博士论文要先把这个课题的前人成果讲一遍,并且实践一遍,有自己的数据结果。如果没有这块东西,直接上来就讲自己的方案,不好意思,学术期刊把你当成民科直接毙掉,人家根本不会接纳你。

    所以,大家做论文怎么做的,做技术预研课题,做分享讲座的课题,是一样一样的。原本空空如也的大脑,怎么会产生优秀的方案?肯定得先把顶级公司顶级程序员的优秀方案梳理一遍啊。

    我前几天举了一个最新的例子:

    《MTDDL——美团点评分布式数据访问层中间件》

    文章脉络为:

    • 背景

    • 业界调研

    • 功能特性

    • 设计目标

    • 逻辑结构
    • 具体实现

    这就是深度思考的套路。再早之前,我在《有些事儿,工程师可能今生仅此一次》中说过,强制性要求你从定义问题开始,训练自己主动搜索、主动链接、主动构建知识、主动试验、有始有终的能力。好好体会一下吧。


    四,学会讲故事:

    我举了四个前几年内部PPT的例子,他们讲故事的模式是:

    贺晋恩《类的生命周期》:讲故事就踏踏实实把一件事讲透,不要贪多嚼不烂,真的有人打算在一个小时内把Java内存或MySQL优化讲完?!你驾驭不了这样宏大的话题,你还是踏踏实实把一个微观话题讲清楚吧。

    曹超锋《Trace系统调研报告》:典型套路。把一个大的抽象Topic“分布式跟踪”,分解为收集数据、存储数据结构和展示数据三个子Topic,大致都怎么做,然后讲Google、Facebook、Twitter三个业界顶尖方案。

    吴佰清《HTML5移动开发经验分享》 :先用基础demo演示吸引大家的注意力,让大家有一个感性认识。然后技术选型涉及7、8个,每个只用一页讲清楚,有原理,有代码,容量刚刚好,不多又不少。再讲一个较为复杂的Demo,最后回归工作本质,以我们遇到了哪些问题如何解决作为Happy Ending!

    宋玥辉《Disruptor技术入门》 :背景、算法、业务场景、优缺点、问题,脉络清晰。而且本来Disruptor的算法就挺复杂的,把这条主线讲清楚就行,边边角角的算法事儿都不要再提,人类的注意力和脑力是有限的,一次不要讲太多算法。

     

    总结一下,讲故事的方法是:

    • 主线要分明!不要设计多条主线!一般来说,电影是前面有伏笔,后面是重头戏,戏剧高潮都在后面,前后呼应。那么如果你前面讲的知识,在后面的重头戏里没有体现,那就不要讲。什么都想讲,结果就是什么都讲不好。

    • 把握节奏!如果信息量特别大,你要么裁剪,把其实与今后工作无关的内容裁掉,要么适当加入目录页或过渡页,让大家得到缓冲,脑子休息一下,否则就容易把人讲疲乏,讲困了。

    • 讲故事,重要的是逻辑贯穿。不要前面都已经兴高采烈地讲到了codis、redis cluster和sentinel方案,后面又突然切回什么是redis,redis的命令参数,咱不带倒叙的!

    再次强调一遍:

    想讲好故事,先得观摩和揣摩一下别人是怎么讲故事的,或者说为啥讲的那么枯燥。哪里有这些故事?

    这里:

    这里:

    这里:

     

    不妨订阅我的微信订阅号『老兵笔记』:

    展开全文
  • 上一篇我们讲解了, flex...flex布局提供另外一个属性flex-basis 它用来设定元素在主轴方向的大小 注意主轴可以是row方向, 也可以column方向 另外, 某个子元素, 可以单独设置跟其它子元素不一致的(侧轴)对齐方式...

    上一篇我们讲解了, flex容器的属性, 如何定义主轴方向, 以及主轴\侧轴对齐方式

    这篇讲解子元素的一些属性.

    如何对子项目进行排序?

    弹性盒模型第一次可以让我们方便的对元素进行排序

    使用 order属性, 它的默认值是0

    元素按照order顺序排列

    如何定义子项目大小?

    flex布局提供另外一个属性 flex-basis

    它用来设定元素在主轴方向的大小

    注意主轴可以是row方向, 也可以column方向

    另外, 某个子元素, 可以单独设置跟其它子元素不一致的(侧轴)对齐方式.

    最后, 要隆重的介绍flex-grow这个属性了

    它叫做『剩余空间瓜分比例』

    从图上可以看出, AB没有撑满flex容器, 如果希望AB调整大小撑满容器的话

    我们需要加上flex-grow这个属性

    .container {
        display: flex;
        width: 500px;
        ....
    }
    div:nth-child(1) {
        width: 100px;
        background-color: pink;
        flex-grow: 1;
    }
    div:nth-child(2) {
        width: 100px;
        background-color: lightseagreen;
        flex-grow: 1;
    }

    那么AB元素会按照1:1的比例把父元素剩余的空间瓜分掉, 效果如图

    当然, 如果你希望B保持不变, 只有A变大的话, 你可以这样写

    div:nth-child(1) {
        background-color: pink;
        flex-grow: 1;
    }
    div:nth-child(2) {
        background-color: lightseagreen;
        flex-grow: 0;  /*默认值就是0, 其实不用写*/
    }

    我们也可以调整比例

    div:nth-child(1) {
        width:100px;
        background-color: pink;
        flex-grow: 2;
    }
    div:nth-child(2) {
        width:100px;
        background-color: lightseagreen;
        flex-grow: 1; 
    }

    AB按照2:1的比例瓜分了剩余空间

    既然可以放大, 元素也能缩小

    接下来介绍flex-shrink属性, 它叫做多余空间削减比例

    当元素大小超出了flex父容器, 子元素可以按比例缩减.

    但是这里的算法比刚才的flex-grow复杂了一些

    我们先看一种简单的情况

    .container{
    	display: flex;
    	flex-direction: row;
    	justify-content: flex-start;
    	box-shadow: 0 0 0 1px black;
    	height: 100px; width: 400px; /*父元素宽度为400*/
    } 
    div:nth-child(1) {
    	width: 300px;  /*子元素A宽度为300*/
    	background-color: pink;
    	flex-shrink: 1; /*多余空间削减比例为1, 默认值为1, 可以不写*/
    }
    div:nth-child(2) {
    	width: 200px;  /*子元素B宽度为200*/
    	background-color: lightseagreen;
    	flex-shrink: 1; /*多余空间削减比例为1, 默认值为1, 可以不写*/
    }

    削减比例我们设置了1:1 , 那么实际结果呢?

    从图中的实际效果来看,

    A元素削减了60个像素

    B元素削减了40个像素

    这并不是1:1啊, 这是3:2啊

    这个3:2又是怎么来的呢?

    其实, 它就是AB元素的原始比例大小

    所以, 在削减比例上, 元素还会受到原始大小比例的影响 总结一个公式如下: 子元素的削减比例===原始大小比例 X flex-shrink比例

    那么, 根据我们所得的公式, 如果我们想让上面的例子当中

    AB元素都削减一样的大小该如何做呢?

    答案就是:

    div:nth-child(1) {
    	width: 300px;
    	background-color: pink;
    	flex-shrink: 2;
    }
    div:nth-child(2) {
    	width: 200px;
    	background-color: lightseagreen;
    	flex-shrink: 3;
    }

    最终效果:

     


     

    让我们来总结一下

     

    项目的属性(添加在子元素身上的属性)

    • Order属性

    order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

    .item {
       order: <integer>;
    }
    • flex-basis属性

    flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。

    .item {
        flex-basis: <length> | auto; /* default auto */
    }
    • align-self属性

    align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

    .item {
         align-self: auto | flex-start | flex-end | center | baseline | stretch;
    }
    • flex-grow属性

    flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

    .item {
       flex-grow: <number>; /* default 0 */
    }
    • flex-shrink属性

    flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

    .item {
        flex-shrink: <number>; /* default 1 */
    }
    展开全文
  • 上一篇我们讲解了, flex容器的属性, 如何定义主轴方向, 以及主轴侧轴对齐方式这篇讲解子元素... flex布局提供另外一个属性 flex-basis它用来设定元素在主轴方向的大小注意主轴可以是row方向, 也可以column方向另外, ...
  • 今天我会以我个人的经历或者经验来“管理”甲方的3点: 管理甲方需求 做到比甲方更理解需求,更理解问题 问题讨论时,给甲方选择题,并引导甲方选择正确的答案 管理甲方需求 1.为何要管理甲方需求? 我...
  • 终极利器|篇文章讲清楚Python虚拟环境 我在之前写过篇「Python新手常见的几问题及工具推荐」说过新手往往没有注意环境隔离,导致Python项目包与包之间冲突。 并且Python2与3代码执行有问题等等。鉴于此我...
  • 副标题:IT售前如何真正调研清楚IT项目背景、客户需求? 写在文章正式内容前的段文字:你清楚客户建设项目背后的原因吗?你知道客户想要的是豪宅还是法拉利吗?如果不知道请耐心往下看! . 项目背景 项目背景...
  • Spring Boot 可以兼容老 Spring 项目吗,如何做? 什么是 Spring Cloud? 介绍一下 Spring Cloud 常用的组件? Spring Cloud 如何实现服务注册的? 什么是负载均衡?有什么作用? 什么是服务熔断? 请介绍...
  • 我在之前写过篇「Python新手常见的几个问题及工具推荐」说过新手往往没有注意环境隔离,导致Python项目包与包之间冲突。...很多开发者都会习惯用Python开发项目,但是由于我们每个项目情况都有些不...
  • 项目好不好,也不是我们小白说了算,还是要看该项目在整个市场中的表现,但就一个新项目来,刚开始就有百万人的关注,可以说这个项目绝对有搞头,值得关注. 网上有传该项目可能是一个百倍币,这个是真是假咱不清楚,咱...
  • 就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的...
  • 我在之前写过篇Python学习教程,说过新手往往没有注意环境隔离,导致Python项目包与包之间冲突。 并且Python2与3代码执行有问题等等。...很多开发者都会习惯用Python开发项目,但是由于我们每个项目情况都有...
  • 就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的...
  • 就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的...
  • 也就是说,虽然你知道自己想要什么,但是不知道出于什么原因,你没有设定一个清晰可衡量的目标,而目标不够清晰的话,必然会引发时间预算、人力预算,以及优先级决策的模糊。 虽然在你眼中目标很清晰,比如“到年底...
  • 就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的...
  • 最近应聘到了一家公司,他们准备开始web端的内容做成android应用,我是唯一的一个android开发,但我之前并未做过企业级项目。 我知道怎么做android,但是不清楚,要做一个企业级应用应该从什么地方开始。 比如用...
  • 这里是我们认为最重要的一点,假如我们测试的项目大而复杂,我们可以把项目功能细分,根据每一个功能通过编写用例的方式来整理我们测试系统的思路,避免遗漏掉要测试的功能点。 跟踪测试进展 通过编写测试用例,...
  • 有时候导入的项目工程,文件夹左下角永远有一个红叉,但是由于不影响程序运行,所以之前一直忽略了,但是强迫症患者表示不解决巨蓝瘦,网上有些方法没有讲清楚,所以今天做了个总结来教大家如何详细解决这个问题!...
  • 口述 | 孙菡浥 以太白泽资本副总裁,2017年度以太之星、业绩冠军北京大学光华营销专业、艺术学双学位来源 | 以太创服A+社晚八点...故事的怎么样会影响整个项目未来的天花板与市场空间,也会影响到投资人对项目的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 418
精华内容 167
关键字:

如何讲清楚一个项目