![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计、模式、架构
文章平均质量分 75
系统架构与设计模式
AI高工
程序员,AI工程师,分享人工智能、机器学习、大模型、软件工程、游戏开发、网络、云计算
展开
-
共享docker容器还是使用多个相同容器
综上,可以决定是共享一个数据库容器还是使用多个数据库容器。通常,对于小规模或初始阶段的项目,共享一个数据库容器可以简化部署和管理。随着项目的发展和需求的明确,可能需要逐步迁移到更复杂的架构,如使用多个数据库容器。原创 2024-05-08 17:19:03 · 255 阅读 · 0 评论 -
游戏开发团队配置与协作流程
游戏开发技术图谱 - 知乎游戏制作的流程是什么啊? - 知乎系统策划:一张图梳理游戏系统的生产流程 - 知乎原创 2023-11-22 14:31:19 · 269 阅读 · 0 评论 -
问题解决和批判性思维是软件工程的重要核心
编写代码仅仅是整个过程中的一小部分,这个过程实际上充满了精确分析、抽象推理和创新解决问题的元素,而键盘上的敲击只是这个过程的可见输出。在这个阶段,工程师会应用几种问题解决策略,如分解(把问题分解成更小、更易处理的部分),模式识别(寻找当前问题与之前问题的相似之处)以及抽象(去掉不必要的细节,专注于核心问题)。此外,工程师需要预见并处理可能出现的错误和异常,批判性思维在识别潜在的问题和边缘情况时起着重要作用。这包括理解问题的细节,预测用户的需求,以及描绘出问题的界限,包括限制和要求。原创 2023-08-04 12:10:33 · 2040 阅读 · 0 评论 -
python-泛函数式程序设计&面向对象程序设计
python是面向对象语言,一切皆对象,既支持面向对象编程,也支持函数式编程。原创 2022-12-13 14:33:42 · 280 阅读 · 0 评论 -
OOP的弊端:自顶向下还是自底向上
OO在GUI、仿真和图形领域里取得成功的原因,可能是因为在这些领域中,相对而言,比较容易解决“类型存在与否”的问题。自顶向下在下面三个条件成立的时候,是很好的经验:a. 你可以事先经确定义程序的需求,b. 在实现过程中,该规范不大可能变化,c. 在最底层,你有充分的自由来选择完成工作的方式。举个例子,格式转换函数的作者经常会不假思索地要一个源文件的路径名作为参数,可是输入经常来自一个打开的文件句柄,如果设计成正交的,则该函数不应该有“打开文件”的副作用,则将来这个函数可以处理来自各种源头的数据流。原创 2023-02-07 11:01:14 · 546 阅读 · 0 评论 -
如何快速上手一门新语言
在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,.NET的delegate,Java的anonymous inner class,Java 7的closure,C++OX的 tr1::function/bind,五花八门。经过这么多年,我已经能够相信,三种流程控制结构加简单的类型机制,已经能将一切现实问题的解法映射给计算机,学再多的语言,再多的语言机制,不过学到了更多的映射手段,代码结构方面的东西,真正要解结的问题呢,反而被模糊了,对语言的学习应适可而止。原创 2023-02-07 10:05:57 · 335 阅读 · 0 评论 -
对抗软件工程的复杂度
后来增加了服务C也会调用服务S,服务C调用服务S的时候发现服务S有个实现上的缺陷,此时理论上应该修改服务S,但由于负责服务S的团队怕影响其他现有服务所以并没有解决该问题的动力,或者由于负责服务A的团队正忙于其他新特性开发,所以服务C的团队不得不曲线救国,在自己的服务C中实现workround。随机复杂度是我们需要重点关注的,其中的短视效应表现为急功近利,急功近利的做法会快速增加系统的技术债务,使得架构腐化加速,由此造成后续开发的认知负荷提升,需要更多的协作,造成协同复杂化,进而降低研发效能。原创 2023-02-06 13:59:31 · 325 阅读 · 0 评论 -
python的单例模式
如果在程序运行期间,有很多地方都在使用配置文件的内容,也就说,很多地方都需要创建Appconfig 对象的实例,这样子就会导致系统中存在很多Appconfig 的实例对象,而这种会严重浪费内存资源。python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。我们知道,当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.new),实例化对象;原创 2023-01-18 16:02:23 · 599 阅读 · 0 评论 -
《重构,改善既有代码》读书笔记
一、为何要重构1、重构让代码更易阅读和理解。2、重构改进软件设计我个人认为,上述两点完全可以是重构的动力。二、什么情况需要重构1.重复代码2.过长函数3.过大的类4.过长参数列5.违反单一职责原则(即有多个理由去修改一个类)6.散弹式修改(如果每遇到某种变化,你都必须在许多不同的类做出许多小修改,就应该考虑提到一个类中)7.数据泥团(如果在很多地方看到相同的三四项数据:两个类中相同的字段、许多函数中相同的参数。就可以把他们提到单独类中)。8.switch惊悚现原创 2020-12-11 08:32:43 · 225 阅读 · 0 评论 -
请保持谦卑!——读《人月神话》有感
小brooks的《人月神话》这本书在软件工程管理领域畅销40年,我看的是40周年中文纪念版。相比于原版增加了一些作者根据今天软件工程管理现状添加的一些新的观点与评论,看看哪些过时了,哪些依然有效。另外还附录了一些名人以及读者对本书的评论。整体来说,本书的主线——人月神话、没有银弹在现今的软件工程管理领域依然属于有效的基础理论。但是,其中一些方法论对于国内的软件项目管理的环境是不适应...原创 2020-02-23 11:12:30 · 330 阅读 · 0 评论 -
Code Complete《代码大全》读书笔记
最近拜读了《代码大全》,这部大块头确实经典,涉及到了软件开发的方方面面。有点后悔没有早些阅读,值得推荐给还没读过的朋友。它并不是针对某种语言的武林秘籍,应该可以看作是基础内功修炼吧。笔记比较简略,只供简单查阅~一、开发前期准备相关1.需求阶段:发现错误的时间要尽量接近进入该错误的时间。由于需求是首先进行的活动,所以需求阶段引入的缺陷可能在系统中潜伏的时间最长,代价也更昂贵。 如果没有一个良好的问题定义,你努力解决的可能是一个错误的问题。 明确的需求有助于确保用户驾驭系统的能力; ...原创 2020-12-11 08:22:35 · 1634 阅读 · 0 评论 -
数据埋点的应用场景与工作流
运营人员提出埋点需求:不仅涉及埋点的位置,比如App 的开屏页、App 首页联版、App 首页 banner 位,还涉及需要埋点的终端,比如有的埋点需求只 需要进行 App 端的埋点,而有的埋点需求需要进行 App 端、微信小程序、 WAP 端等多端的埋点。比如,购物车 的点击、微信朋友圈的点击、图片的点击等都可以记为一次页面点击。数据产品经理写出数据埋点需求文档,列出埋点位置、埋点所需的参数、 涉及的埋点终端、埋点需要调用的接口、埋点是否需要异步触发、本次埋点需求期望的上线日期和联调日期等。原创 2022-11-21 12:17:59 · 47 阅读 · 0 评论 -
创造其它语言的语言 - Lisp
实际上,我们的JSON数组语言是由JavaScript实现的,两者是融为一体的,想对JSON数组语言增加语法,必须要写对应的JavaScript代码。但是对Lisp来说,它的代码本身就是数据,此外Lisp还支持宏(macro),宏可以直接把列表当做数据来操作,从而生成新代码,不需要其他语言的介入。你可以想象,你可以和语言设计者站在同一个层次去增强一门语言,把那个语言变成一个属于你所在业务领域的语言,然后用新语言去编程,那编程速度得有多快!如果我们想用操作数据一样来操作代码, 答案就是:把代码变成数据。转载 2022-10-17 23:18:57 · 366 阅读 · 0 评论 -
Unity ECS 测试Demo
ECS比较适用于场景中有大量独立的agent逻辑的场景,比如RTS,模拟经营这类游戏就很适合用ECS进行优化。 作者:BN的日记 https://www.bilibili.com/read/cv12251470 出处:bilibili原创 2022-07-17 20:03:35 · 1654 阅读 · 0 评论 -
编程思想的演进
从上个世纪五十年代冯·诺依曼创造第一台计算机开始,一直到现在只有短短70年时间,从第一门计算机语言FORTRAN,到现在我们常用的C++,JAVA,PYTHON等,计算机语言的演进速度远超我们所使用的任何一门自然语言。从最早的面向机器,再到面向过程,到演化为现在我们所使用的面向对象。不变的是编程的宗旨,变化的是编程的思想。1 面向机器计算机是01的世界,最早的程序就是通过这种01机器码来控制计算机的,比如0000代表读取,0001代表保存等。理论上这才是世界上最快的语言,无需...原创 2022-05-06 09:15:09 · 497 阅读 · 0 评论 -
Unity项目技术方案Dots架构方案简介
DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈(DOTS),它由任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器三部分组成。DOTS保证相同类型组件在内存中都是顺序排列,极大程度增加缓存的命中率,此外配合任务系统(Job System)让开发者无需头疼多线程同时访问数据需要手动加解锁的麻烦,最终加持Burst Compiler让性能飞起来。ECS、JobSystem、Burst。这三个组建是可以相互独立使原创 2022-03-13 16:45:03 · 14141 阅读 · 0 评论 -
多线程、异步导致的时序逻辑Bug
在实际开发程序的过程中,经常会遇到一些由于时序的先后顺序,导致产生一些奇奇怪怪的问题,很多是由于多线程、异步等导致的时序逻辑Bug, 比如:消息A先到达,消息B后到达,消息A处理完成后,再处理消息B,程序就正常运行(即达到我们我们预想的结果);然而如果消息A没有处理完,就开始处理消息B,程序可能会出现我们不期望的结果。 为了避免上面问题的出现,我们可以采取将同一类消息按先后到达顺序放在同一个队列中,然后有同一个线程来处理,这样就能保证按照时序处理。...原创 2022-03-11 09:41:21 · 1125 阅读 · 0 评论 -
Unity 知识点小结
第一部分:1、C#有几种数据类型?答:C#通常分为三种数据类型:值类型(ValueType)、引用类型(Reference types)和指针类型(Pointer types)。值类型可以直接分配给一个值。它们是从类System.ValueType中派生的。值类型直接包含数据。比如int、char、float,它们分别存储数字、字符、浮点数。当您声明一个int类型时,系统分配内存来存储值。引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。换句话说,它们指的是一个内存位置...原创 2020-07-31 12:03:13 · 3472 阅读 · 2 评论 -
游戏开发与设计中的“3C”是指什么?
游戏开发与设计中的“3C”是指什么?https://mp.weixin.qq.com/s?__biz=MzkzNTIxMjMyNg==&mid=2247492980原创 2022-01-30 15:37:26 · 2569 阅读 · 0 评论 -
C# 单例和静态类
单例与静态类的相同作用1.单例与静态类只能拥有一个实例,该实例在应用程序的整个周期中用于保持应用程序的全局状态。2.单例和静态类都可以实现线程安全。单例与静态类的区别?需要记住的是, 静态是属于C#中的一种语言功能, 而单例是一种设计模式。所以两者属于不同的领域。1.无法创建静态类的实例, 但是可以创建单个类的实例, 然后重用。2.编译器编译静态类, 在内部静态类视为抽象和密封类。3.单例的构造函数始终标记私有, 我们无法从单例类外部创建实例。4.静态类是在应用程序第一次加载进行初..原创 2022-01-30 15:25:37 · 1144 阅读 · 0 评论 -
Unity中多种单例模式的实现方式
两大类,一类是普通C# 类 的单例,二类是继承Mono的单例普通C#类:1. 普通类的单例懒汉式(首次调用的时候才实例化,非线程安全) public class GameManager { private static GameManager instance; //单例对象,全局唯一 public static GameManager GetInstance //获取接口,也可以写成函数形式 {原创 2022-01-30 15:18:25 · 3706 阅读 · 0 评论 -
UnityUI列表的多种实现方案
简易版private void SetItemList(List<int> items){ foreach(var item in items) { var cell = Instantiate(ResourcesLoader.Load("UI/prefab/UIEquip")) as GameObject; cell.transform.SetParent(this.itemsBg.transform); UIE原创 2021-11-25 11:33:23 · 3584 阅读 · 0 评论 -
程序设计之Dry和Shy原则
保障可维护性的主要诀窍是遵循DRY原则和Shy原则。在一个系统的整个生命周期里,理解和改动这类维护工作的比例一般非常之高。为了维护的方便,要尽量将系统划分为可以独立理解与改动的模块。这就要在设计的时候注重DRY原则与Shy原则。不过,这两条原则有一定的冲突,并不总能兼得,于是在追求的时候要重视分寸。维护者的两大困扰有两种情况会给维护者增添很大的麻烦:一种是为了调整一个效果,要改动无数个地方;一种是只改动了一个地方,却影响了很多效果。在前一种情况下,非常容易出现漏改的问题——因为需要改动的地方原创 2021-11-17 10:14:02 · 215 阅读 · 0 评论 -
持续重构 避免过度设计
应用设计模式会提高代码的可扩展性 ,但同时也会带来代码可读性的降低,复杂度的升高. 一旦我们引入某个复杂的设计,之后即便在很长一段时间都没有扩展的需求,我们也不可能将这个复杂的设计删除,整个团队要一直背负着这个复杂的设计前行.为了避免错误的需求预判导致的过度设计,我非常推崇持续重构的开发方法.持续重构不仅仅是保证代码质量的重要手段,也是避免过度设计的有效方法.为什么要持续重构_xiexiaojing的博客-CSDN博客...原创 2021-10-18 12:20:39 · 364 阅读 · 0 评论 -
C# 语法糖(Syntactic sugar)
定义语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。简而言之,语法糖就是一种便捷写法。1. 自动属性未简化:手写私有变量+公有属性private string _name;public string Name{原创 2021-10-12 20:03:47 · 5761 阅读 · 0 评论 -
被误解的 MVC 和被神化的 MVVM
MVC 的历史MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示的是一种常见的客户端软件开发框架。MVC 的概念最早出现在二十世纪八十年代的施乐帕克实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式。现在,MVC 已经成为主流的客户端编程框架,在 iOS 开发中,系统为我们实现好了公共的视图类:UIView,和控制器类:UIV...原创 2021-09-28 19:44:48 · 434 阅读 · 0 评论 -
自顶向下与自底向上编程思想的对比
在国内的网站上搜索什么叫“自底向上”编程,给人的感受似乎是同一个问题有两种解决思路,一个是“自顶向下”,一个是“自底向上”。但你仔细看那些文章的讲解,其实说的都只是“自顶向下”。为了说清楚“自底向上”编程,首先赘述一下什么叫做“自顶向下”编程。自顶向下编程自顶向下编程一般会好理解一点。首先从整体分析一个比较复杂的大问题。为了解决这一问题,必须把它拆分来看,应当解决哪几个小问题,然后再逐步细分到更小的问题,直到每个问题对我们来说,都已经很简单。解决了所有的小问题,逐步向上汇总,就完成了最初的复杂.原创 2021-07-29 15:39:37 · 4621 阅读 · 2 评论 -
OD逆向一个简单的工程实战
今天闲着没事干,找朋友要了一款简单的登录软件用来写这篇基础入门文章,这篇文章算是最基础的一个逆向工程的实战演示。软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为..原创 2021-07-09 11:17:59 · 1331 阅读 · 1 评论 -
程序设计原则之Tell, Don’t Ask原则
代码中,我看到的最多被违反的原则是“命令,不要去询问(Tell, Don’t Ask)”原则。这个原则讲的是,一个对象应该命令其它对象该做什么,而不是去查询其它对象的状态来决定做什么(查询其它对象的状态来决定做什么也被称作‘功能嫉妒(Feature Envy)’)。在面向对象的编程中,一个对象被定义成由对象状态和操作这个状态的方法组成。在《Holub on Patterns: Learning Design Patterns By Looking At Code》这本书里,Allen Holub在第一章原创 2021-06-07 10:04:27 · 1315 阅读 · 0 评论 -
程序设计原则之SOLID原则
设计模式中的SOLID原则,分别是单一原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则。前辈们总结出来的,遵循五大原则可以使程序解决紧耦合,更加健壮。SRP 单一责任原则 OCP 开放封闭原则 LSP 里氏替换原则 ISP 接口隔离原则 DIP 依赖倒置原则 单一责任原则指的是一个类或者一个方法只做一件事。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化就可能抑制或者削弱这个类完成其他职责的能力。例如餐厅服务员负责把...原创 2021-06-07 10:02:06 · 8518 阅读 · 0 评论 -
OOP有什么弊端
作者:田乐链接:https://www.zhihu.com/question/20275578/answer/27073776来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。OO 一方面是一个过载的概念(包含了很多广义的最佳实践),另一方面 OO 又被很多误解所包围。从我个人经历的角度,这些地方值得注意。OO 是一个与时俱进的概念,我们不能绝对的讨论最早提出 OO 理论的人所谈论的那个 OO。我们还要讨论后来对 OO 阐述的不同角度,或者说 OO 的不同流派。我比较原创 2021-06-05 18:29:46 · 617 阅读 · 0 评论 -
面向对象程序设计
1.面向对象是相对于面向过程的,比如你要充话费,你会想,可以下个支付宝,然后绑定银行卡,然后在淘宝上买卡,自己冲,这种种过程。但是对于你女朋友就不一样了,她是面向“对象”的,她会想,谁会充话费呢?当然是你了,她就给你电话,然后你把之前的做了一遍,然后她收到到帐的短信,说了句,亲爱的。这就是面向对象!女的思维大部分是面向“对象”的!她不关心处理的细节,只关心谁可以,和结果!2....原创 2021-06-04 13:34:09 · 6719 阅读 · 4 评论 -
IoC, DI, SL, DIP 依赖注入,控制反转
化简为繁把人绕晕版:首先得先说清几个名词 IoC, DI, SL, DIP。IoC(控制反转)目前比较流行的两种方式 DI(依赖注入模式) 和 SL(服务器定位模式),DI 是遵循 DIP(依赖反转原则)的,SL 是 anti-pattern(反模式)的,不遵循 DIP。因为注入的形式五花八门,为了代码复用性和扩展性出现了 IoC container 这么个东西,它是遵循各自 DI/SL 模式实现的容器,DI 容器会大量的运用反射机制来实现。提到的 Laravel 中 Service .原创 2021-05-06 09:21:26 · 273 阅读 · 0 评论 -
时间复杂度和空间复杂度
数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间、空间复杂度分析。为什么需要复杂度分析?首先,我可以肯定地说,你这种评估算法执行效率的方法是正确的。很多数据结构和算法书籍还给这种方法起了一个名字,叫事后统计法。但是,这种统计方法有非常大的局限性。 测试结果非常依赖测试环境 测试环境中硬件的不同会对测试结果有很大的影响...原创 2021-04-30 17:46:59 · 912 阅读 · 1 评论 -
Unity中的面向对象
面向对象是的精髓,是其能够模拟真实世界的根源所在,面向对象问题也是诸多Unity程序员每天需要苦苦面对的问题。面向对象思维的精髓是:依据我们所生活的这个物理世界中的奇妙特性,将世界观与代码观融为一体。Unity中的面向对象1 场景物体与脚本看图中标注的1,2,3三大块。【单击图片可放大】第1块: Hierachy在场景下面有 Main Camera,Directional Light,Cube和s四个物体,这四个物体都是在场景中实实在在存在的游戏对象,即GameObject.原创 2021-04-29 15:04:19 · 1275 阅读 · 1 评论 -
设计模式-可复用版-Command 命令模式
在Command里,包含了我要操作、处理的对象。比如粘贴命令中,肯定包含文档Document本身 。Command模式代码结构很简单,定义一个Command接口,包含了一个Execute()的方法:namespace PureMVC.Interfaces{ public interface ICommand : INotifier { void Execute(INotification Notification); }}...原创 2021-03-12 08:28:06 · 182 阅读 · 0 评论 -
pureMVC的争议,说说缺点
pureMVC的争议,说说缺点...pureMVC的优点资料很多,他实现多种设计模式,解耦彻底,灵活度非常高,重用性高,易扩展.写这篇文章仅表达本人的怀疑精神,如有不对,请指教学习.首先先链两篇我搜到的文章PureMVC 的得与失pureMVC优缺点<设计模式:可复用面向对象软件的基础>说过一点,为适合的程序选择适合的设计模式,其它介绍设计模式相关的书都有提过类似的观点.pureMVC底层实现了多种设计模式,但是,那些并不是提供我们在适合的时候去用,而是约束各模块开发时,..原创 2021-03-09 11:19:23 · 455 阅读 · 0 评论 -
从MVC到云原生:CBU研发体系演进之路
远岩阿里巴巴中间件刘明昊,花名远岩,高级开发工程师。2019年毕业加入阿里巴巴,主要负责 CBU APP 端前台场景工程体系及服务端 Serverless 化建设。前言CBU 作为阿里集团内最早成立的几个 BU 之一,有着多年丰富的业务沉淀,而 CBU 的技术也伴随着业务一起不断地演进和成长着。从 PC 时代的 WebX 到如今的 Serverless,CBU 的研发体系经历了多次变革,在不同的阶段中有着不同的特点。笔者所在的团队近年来一直在负责前台场景研...原创 2021-02-27 10:15:26 · 402 阅读 · 0 评论 -
源码阅读的技巧和误区
普遍存在如下几种现象: 对待工作中所使用的技术不需要阅读源码,只需在开发过程中能够熟练运用就行 看源码太费时间,而且容易忘记,如果从实际使用过程中出现的问题出发,针对性的阅读源码,其学习效率会更高效,所以平时无需看源码。 对此我有着不同的理解,容我慢慢道来。本文将从如下4个角度进行剖析: 源码阅读的必要性 源码阅读技巧 源码阅读的三种境界 源码阅读的误区 01源码阅读必要性1.1 通用型基础技术应该深入源码研究在 JAV..原创 2021-02-19 12:37:16 · 278 阅读 · 0 评论 -
docker以外的构建、运行、管理和分发容器候选项
在容器的远古时期(大约4年前),Docker是容器游戏中仅有的参与者。但是现在情况不一样了,Docker不再是唯一的一个了,只是另一个容器引擎而已。Docker允许我们构建,运行,拉取,上传,查看容器镜像,但是对每一项任务都有其他可以比Docker做得更好的工具。因此,让我们看看现在的情况,卸载(只是可能)并且忘记Docker的全部信息。01—不过,为什么不使用Docker?如果你是一名Docker的老鸟,我想即使考虑使用不同的工具,也需要一些说服自己的理由。那么,理由就在这里:首.原创 2021-01-18 08:03:28 · 310 阅读 · 0 评论