Understand the Instanceof Keyword

Understand the Instanceof Keyword

如果一个class implement 了一个interface,竟然可以。。。。

直接看代码:

1
2
3
4
5
6
7
8
<?php
class Test implements Testable {}

interface Testable {}

$test = new Test();

echo $test instanceof Testable; //1

这个instanceof关键字让我感到非常意外,所以继续深入学习,而不是停留在CRUD层面,是非常非常重要的。

First Time to Implement a Design Pattern

今天第一次实现了Strategy Pattern,感觉还是很不错的,有点醍醐灌顶的感觉。

这个Strategy Pattern的核心是,要把一个功能(行为/算法/方法等)抽象成一个interface

通过一个class,具体实现这个interface里的方法(function)。同一个interface可以被多个的class “implement”,这些对这个interface有不同实现的class就是一个个功能点了。

最后,按需组合即可,就组合出了不同的功能点的集合,特别适用于具体功能点不同、但总体上又可以归为一大类的一些对象。

比如鸭子,有FlyQuack两个不同的功能,但不同种类的鸭子,具体怎么FlyQuack又显然不同,这时就应该用Strategy Pattern了。

甚至于,如果要增加鸭子的一个新的功能,比如swim,那就先写一个SwimInterface,然后再用不同的swim Class来实现SwimInterface里的函数。最后,在不同种类的鸭子中,选择某个合适的swim Class。

具体实现看代码吧:

@i2j/dsaa

最后,我发现不同的语言有不同的优势。比如PHP和Java有非常经典的OOP写法,就比JavaScript更适合做这些OO思维的东西。但我学数据结构,最容易看懂的书却又是用JavaScript实现的。

SNS Is Everything

SNS is everything

社交是一切商业之母

Eric曾经曰过,目前互联网和其他科技界,凡是面向消费者的公司,基本都是16个字:
衣食住行,吃喝玩乐,装逼约炮,好吃懒做。

通过极强的社交属性,微信在各个方面深度渗入其他王国的领地,例如移动支付,这甚至都快把马云给逼疯了。即便搞出来“支付婊”事件,也然并卵,不仅进军社交的努力失败了,而且更惹得一身坏名声。支付宝想做社交,都快想疯了。

其实支付宝有自己的护城河,就是建立一个信用体系,这一点已经相当成功。中国的特殊国情导致了支付宝的崛起,所以支付宝应该继续对标欧美日的信用体系,继续强化国人的信用体系的建立。

其实从另一个角度,也可以同样得出“社交是一切商业之母”这个结论。在互联网领域,有一个“高频打低频”的规律,就是一个网站、应用或服务,如果打开频次足够高,人们会倾向于在这个高频应用里做所有一切可以做的事。而什么是你每天都要是用的服务呢?当然是社交了。不管技术怎样变化,不变的是人性,人们永远有和其他人社交的需求,尽管社交的形式一直在变。

那么,你搞定了社交,就理所当然的可以侵入其他商业王国的领地。纯工具属性,或者说任何单一属性的网站、应用或服务,最后都会受到来自社交的威胁。目前在线下支付领域,微信支付在频次和额度上已经超过了支付宝;即便是线上支付,支付宝对微信的份额优势也是急剧的缩小。微信甚至后来居上,发明了“微信红包”这个概念,这已经成了微信的独门绝技和特色了。支付宝是抄不来红包这个概念了,因为红包是一种社交游戏。

如果想要构筑足够宽广的护城河,就必须往社交上靠拢。

有一个以菜会友的app,“下厨房”,花了很多力气做社交,还是很有成果的。

这类似的例子很多,包括为什么知乎估值远高于天涯、猫扑等传统论坛网站,为什么ResearchGate能获得来自比尔盖茨的投资,为什么微软购买了LinkedIn,都是因为这些网站都是人们社交的场所,不管是一般目的的社交,还是专门目的的社交。而Bloomberg,则在金融领域里构筑了一个极其牢固的社交圈子,任何其他类似的金融信息服务都不可能取代这个社交网络,自然也抢不走Bloomberg的生意。

我也似乎终于开始理解为什么在国外有多个社交软件和服务的同时存在。人们的社交,有多重方面和目的。有人想约炮,于是就选择Tinder;同性恋则使用Grindr;有人想在职业生涯上构筑一个人际关系,就选择LinkedIn;有人仅仅想和熟人社交,就用WhatsApp;有人则想关注有趣的陌生人,或者没有社交关系,但仍然需要关注他们的动态,于是就选择了Twitter。还有人想把自己不同圈子区分开来,比如和亲戚长辈们使用Facebook联系起来,和自己的同龄人则使用Instragram或Snap沟通。

社交领域的细分,是一个可行的思路,因为还有某些细分领域是目前大公司或通用社交App尚未触碰的领地。

其实中国的社交网络也是有细分的。比如游戏玩家们,使用YY;中国蓝领阶层以及三四五六七八九线城市互联网用户,使用快手;陌生人交友和约炮,使用陌陌和探探;装逼犯、媒体和白领阶层,使用微博;现在又流行小密圈了,是大V们和粉丝互动的一个平台;知乎则是以观点和问题为载体构建的一个新型社交平台。

至于微信这种超级App,则是中国特殊国情下的产物。不能用常理揣度的。这本质上已经超越了社交,而是一种类似Facebook的一种社交网络的基础设施,已经不是某个细分目的的社交服务了。

DSAA Learning Experience 3 - How to Use Data Structure in Daily Work

怎样把数据结构应用在实际工作中?

我回答一个PHP的吧

有时候,会用到一个PHP函数 in_array(\$needle, array \$haystack),顾名思义,这就是看\$needle这个元素是不是在\$haystack这个数组里

数据量小还没什么,但数据量大了,这个就有性能问题

那咋办?

先把\$haystack做一个\$haystack = array_flip(\$haystack),就是把这个array的key-value互换,比如[‘a’ => 2]就成了[2 => ‘a’]

然后\$needle原本是value ,现在成了key了

那你就isset(\$haystack[\$needle]),这个isset()函数的复杂度是O(n),性能立刻大增

其实还有一个函数,直接查看是否一个key是存在的,array_key_exists(),但这个函数对某些情况不适用(元素是null),而且性能也还是不如isset()

然而,如果真有那么大数据量, 直接上redis了,还用个毛的array_flip()啊

总之呢,数据量小的时候随便搞,没所谓性能问题,数据结构也都不是瓶颈。一旦数据量上去了,才会考虑选择更合适的数据结构。

© 2018 awesome.js All Rights Reserved.
Theme by hiero