首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

生存or毁灭?QQ空间150万行代码的涅槃重生 | 技术创作特训营第一期

但后续的需求迅速膨胀,异化出18种 Feeds 流场景,单 Feeds 流可能出现60多种卡片。这导致基类代码与 Feed View 中的代码迅速膨胀。...痛定思痛,在进行空间重构前的首件事情就是总结经验,避免重蹈覆辙。如何保证这次重构平稳落地并且避免后续每三年一重构? 我们总结了四点: 渐进式重构:高速公路换轮胎,如何平稳落地?...代码复杂度持续膨胀; 各业务代码耦合; 功能代码分散,AB 测试不友好; 难以扩展。...比如同一张卡片在不同的页面需要显示不同效果,比如数据埋点的参数需要从页面最外层传递到 Section。...过去,即使传递一个 pageId 参数,也要一层层传递: 现在,层级再深我们也可以很方便拿到需要的 IOC 实现。

76271
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS的MVC框架之控制层的构建(下)

    MVC被众多开发者所诟病的C层的膨胀,究其原因不外乎有如下几点: 所有视图的构建和布局代码都在控制器中完成。...没有关系,本文探讨的是如何解决控制器代码膨胀的问题,而不是掀起派系之争。那么如果我就是要通过代码的方式来完成界面布局呢?毕竟通过代码布局的方式更加灵活和可配置性(牺牲了所见即所得性)。...@end 上面的两种对视图构建和布局进行分解的方式都可以解决在控制器中视图代码构建导致的膨胀问题。...我们也可以通过组合的形式来解决这个问题,但是组合的使用会在一定程度上增加代码量以及共享参数之间的传递问题,因此最佳的解决方案就是采用类继承的方法。...借助接口 通过方法参数和字典是数据传递的两种不同的方式。缺点是一旦界面变化时都需要手动的调整参数位置和个数。

    4.4K30

    Android-App性能优化

    也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕上。...那么我们如何解决呢,主要从两点入手:ui布局,绘制优化和主线程优化? 布局优化 避免ui布局优化可以先从合理使用背景色开始,比如:如果子view和父布局公用一个背景色就没有必要了。...如果应用程序的Activity仍然驻留在内存中,那么应用程序可以避免重复对象初始化、布局加载和渲染,但系统依然会展示闪屏页,直到第一个 Activity 的内容呈现为止。...在生命周期回调的方法中尽量减少耗时的操作 这个里面的优化方式就是:避免I/O操作、反序列化、网络操作、布局嵌套等。...我们先看看一个apk文件有哪些解压后有哪些文件: assets文件夹 存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过 AssetManager 类的接口获取。

    2.2K40

    synchronized的实现原理——对象头解密

    轻量级锁:在没有多线程竞争,但有多个线程交替执行情况下,避免调用系统函数mutex(特指linux系统)产生的性能消耗。...这个就是synchronized锁膨胀的原理,但并不完全正确,其中还有很多细节,下面就一步步来说明。 对象的内存布局 理论 对象在内存中是如何分配的呢?学过JVM的人应该都知道,如下图: ?...再来看看加锁之后会有什么变化: public static void testLock() { //偏向锁 首选判断是否可偏向 判断是否偏向了 拿到当前的id 通过cas 设置到对象头...注意t1和t2首次都是获取到的偏向锁,并且线程id是相同的,但是按理说线程id应该会变才对,这里笔者猜测为JVM优化,使得线程可以重用,但暂时还无法验证。...总结 本篇是并发系列的第一篇,也是synchronized原理的第一篇,主要分析了锁对象在内存中的布局情况以及锁膨胀的过程,并通过代码验证了所学理论,但synchronized的实现原理是非常复杂的,尤其是优化过后

    59530

    如何优化 Android 的布局性能?如何使用 ConstraintLayout 来减少嵌套层级?

    解决方案:优先使用 ConstraintLayout:替代 RelativeLayout 和 LinearLayout,通过约束关系实现扁平化布局。...减少布局的测量(Measure)时间优化 onMeasure():自定义 View 时避免多次调用 measure()。...数据绑定(DataBinding):减少 findViewById 和手动更新逻辑。六、代码层面的避坑指南避免在 onDraw() 中创建对象:频繁触发 GC 会导致卡顿。...内存占用:每层布局都会占用内存资源,嵌套层级越深,资源消耗越大。二、ConstraintLayout 的核心优势扁平化布局:通过灵活的约束关系替代传统嵌套,单层布局即可实现复杂 UI。...在简单布局中,避免过度使用 ConstraintLayout(如单按钮场景可直接用 FrameLayout)。

    10000

    【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

    视图绑定布局文件 ---- 下面的绑定类定义了三个 TextView , 前两个定义了 id 分别是 text_view 和 text_view2 , 最后一个没有定义 id ; 该布局作为视图绑定的示例布局...生成的绑定类字段 : 只要在布局文件中定义了 id 属性的组件 , 绑定类中就会为该组件生成相应的字段 ; ① 绑定类字段对应布局 ID : activity_main.xml 布局文件中 , 第一个和第二个...获取视图绑定类组件 ---- 可以直接通过 视图绑定类 ActivityMainBinding 对象 binding 获取对应的组件 , 组件名称就是布局文件中定义的组件 id ; //binding...="true" 属性 , 即不为该布局生成绑定类 * * * 视图绑定 与 findViewById 对比 : 避免了很多问题出现 ; * 空指针优化 : 视图绑定 针对一个布局进行自动生成字段...(binding.getRoot()); //binding 中可以直接通过组件 id 获取对应的组件 binding.textView.setText("ActivityMainBinding

    1.2K10

    2025最新出炉--前端面试题七

    清除浮动影响:父元素触发 BFC 后,可以包裹浮动元素,避免高度塌陷。 隔离布局:BFC 内部元素与外部元素互不干扰。 实际应用场景: 实现多栏布局时,避免浮动元素覆盖其他内容。...平时 Symbol 有用到过吗 回答: Symbol 的主要用途是创建唯一标识符,避免命名冲突: 对象属性键: const id = Symbol('id'); const user = {...[id]: '123', // 唯一键,外部无法直接访问 name: 'Alice' }; console.log(user[id]); // '123' 内置 Symbol:...increment: () => privateVar++, getValue: () => privateVar }; })(); 内存泄漏风险: 闭包可能导致外部函数的变量无法被垃圾回收,需手动解除引用...无法传递参数给父类构造函数。 10.

    7010

    《C++代码优化秘籍:减少 CPU 周期,提升程序性能》

    内联函数 C++中的内联函数可以在编译时将函数体插入到调用处,从而避免了函数调用的开销。但是,内联函数也有一些限制,例如函数体不能太大,否则会导致代码膨胀。...减少函数参数传递 函数参数的传递也会带来一定的开销。如果函数参数很多,并且都是值传递,那么会消耗大量的 CPU 周期。 可以考虑使用引用传递或指针传递来减少参数传递的开销。...可以通过分析程序的逻辑,避免不必要的函数调用,从而减少 CPU 周期的消耗。 四、优化循环结构 循环是程序中经常使用的结构之一,但是循环也可能会消耗大量的 CPU 周期。...可以通过分析程序的逻辑,找到可以减少循环次数的方法。 例如,在一个遍历数组的循环中,如果可以提前判断数组的长度,那么可以避免不必要的循环。 2. ...例如,可以使用 objdump 工具来查看编译后的二进制文件,了解函数的调用关系、内存布局等信息。

    32210

    Jetpack组件之DataBinding

    首语 Android 布局文件通常只负责UI的布局工作,页面通过setContentView()关联布局文件,再通过UI控件的id找到控件,接着在页面中通过代码对控件进行操作,因此,页面承担了很大的工作量...; 数据绑定 如何将数据传递到布局文件中呢?首先,在布局文件中定义布局变量,指定对象的名字和类型,当然数据的操作在标签里。...}" /> DataBinding为了方便使用,对布局变量提供了Setter类,因此,在Activity中,通过setBook(),将Book对象传递给布局变量。...一级页面正是通过命名空间xmlns:app引用布局变量book,将数据传递给二级页面的。 需要注意的是,数据绑定不支持include作为merge元素的直接子布局。...需要进行手动更新。 完成双向绑定只需要将布局表达式中的@{}变为@={}即可。username字段会随着EditText内容的变化而变化。

    1.2K20

    【ASP.NET Core 基础知识】--MVC框架--Views和Razor语法

    视图布局 Views支持布局,可以使用主布局文件(_Layout.cshtml)定义整个应用程序的共同结构。通过使用布局,可以实现页面的一致性和重用。 通过利用这些方法,可以减少手动编写HTML元素的工作,同时提高代码的可读性和可重用性。...-- 在布局中引入部分视图 --> @Html.Partial("_MyPartialView") 传递模型给部分视图 如果你希望在部分视图中使用模型数据,可以将模型数据传递给部分视图: <!...} 手动验证 在模型绑定后,可以手动执行验证并检查 ModelState.IsValid 属性。...使用 ViewModel 将必要的数据传递给视图,以避免在视图中执行多次数据库查询。 视图组件 使用视图组件来封装可复用的UI组件,以避免在多个视图中重复相同的代码。

    55120

    GeometryReader :好东西还是坏东西?

    将几何信息传递到上层视图,可能会引起不必要的视图更新。而向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...如果直接将这些负数数据传递给 frame,就可能会出现布局异常(在调试状态下,Xcode 会用紫色的提示警告开发者)。因此,为了进一步避免这种极端情况,可以在传递数据时,将不符合要求的数据过滤掉。...至于如何传递获取的几何信息(例如上文中使用的 @State 或是通过 PreferenceKey),则取决于开发者的编程习惯和场景需求。...与 GeometryReader 不同,满足 layout 协议的布局容器能够在布局阶段就获取到父视图的建议尺寸和所有子视图的需求尺寸。这样可以避免由于反复传递几何数据导致的大量视图的反复更新。...与其说避免使用,到不如说用更加 SwiftUI 的方式来进行布局。

    65870

    探究活动Activity

    1.手动创建活动 首先我们创建一个名为ActivityTestDemo的项目。...注意到,既然是手动创建活动,我们在Add an Activity Mobile这个环节就要选择Add No Activity,如下图所示 ?...Desigr是当前的可视化布局编辑器,你可以通过拖动控件的方式来编辑布局,但并不推荐这样做(适用于快速开发),Text是通过XML文件的方式来编辑布局的,现在点一下Text进行切换。...,在这个方法中传入布局文件的id,项目中添加的任何资源都会在R文件中生成一个相应资源的id,所以我们用R.layout.first_layout来找到这个布局文件,并通过setContentView()...Toast首先通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来,我们看到makeText()方法中传递了三个参数,第一个参数是Context(也就是Toast

    1.4K20

    synchronized 优化手段之锁膨胀机制!

    偏向锁执行流程 当一个线程访问同步代码块并获取锁时,会在对象头的 Mark Word 里存储锁偏向的线程 ID,在线程进入和退出同步块时不再通过 CAS 操作来加锁和解锁,而是检测 Mark Word...里是否存储着指向当前线程的偏向锁,如果 Mark Word 中的线程 ID 和访问的线程 ID 一致,则可以直接进入同步块进行代码执行,如果线程 ID 不同,则使用 CAS 尝试获取锁,如果获取成功则进入同步块执行代码...Mark Word 扩展知识:内存布局 在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为以下 3 个区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding...Klass Pointer(Class 对象指针) 对象在内存中的布局如下: ?...当关闭偏向锁或者多个线程竞争偏向锁时就会导致偏向锁升级为轻量级锁,轻量级锁的获取和释放都通过 CAS 完成的,其中锁获取可能会通过一定次数的自旋来完成。 ​

    43810

    Android可穿戴设备世界之旅

    介绍 Android通过在电视、穿戴和汽车等各种电子模块中扩展下一代应用开发概念,扩展了其整个范围和可能性。本文简要总结和概述了 Android Wear(未来新兴的应用开发平台)中的应用开发。...避免使用用户的传统输入系统,一目了然,将其保持在最低限度,一目了然,为您的手表使用更智能的解决方案,向“Google Now”问好。...您应该实现该接口以检测布局膨胀何时完成。当正确的视图膨胀时,将调用该方法,该方法使用 获取子视图的所需引用。...startActivity(intent); finish(); Log.d("GameActivity:", "Timer >> finished 1 min"); } 在 中,我们将打印传递给此活动的值...,并通过将其保存在 中来跟踪最高分。

    12810

    用户界面开发基础

    ---- 在不同Activity之间传递数据 Activity之间切换时,不可避免的要进行数据传递,例如在单击列表中的某个列表项时,小需要编辑与这个列表项相关的数据,这个时候就需要在显示一个Activity...在Android中传递数据的方法很多,介绍4中比较常用的数据传递方法 通过Intent传递数据 通过静态(static)变量传递数据 通过剪切板(Clipboard)传递数据 通过全局变量传递数据 --...代码演示,通过剪切板传递Data对象。...在不同的XML布局文件中可以存在相同ID的视图,但是在同一个XML文件中,虽然也可以有相同ID的视图,但是通过ID获取视图时,只能够获取按照定义的顺序的第一个视图对象,其他相同ID值的视图对象将无法回去...不能只覆盖一个,否则无效 建议将给include标签调用布局设置宽高、位置、ID等工作放在调用布局的根标签中,这样可以避免给include标签设置属性不当造成的各种问题(之前遇到过给include标签设置

    1.8K20

    CSS动画与GPU

    写在前面 满世界的动画性能优化技巧,例如: 只允许改变transform、opacity,其它属性不要动,避免重新计算布局(reflow) 对动画元素应用transform: translate3d...然后按照顺序把这些层的内容依次绘制在一个内部存储空间上(例如bitmap),最后把这个内部表示显示出来,这种做法就是软件渲染(software rendering) 二.transform和opacity的特殊性 以前通过改变布局相关属性形成动画...GPU的数据,由GPU做scale放大展示,视觉效果无差异(多用于纯色背景元素,对不太重要的图片也可以进行5%到10%的宽高压缩),例如: id="a"> id="b">...例如12道太阳光线旋转,转容器就把容器整张图都发送给GPU,单独转12道光线就去掉了光线之间的11条空隙,能够节省一半内存 5.早早关注复合层的数量和大小 从一开始就关注复合层,尤其是隐式创建的复合层,避免后期优化影响布局...复合层的大小比数量影响更大,但浏览器会做一些优化操作,把几个复合层整合成一个,叫Layer Squashing,但有时一个大复合层比几个小复合层消耗的内存更多,有必要的话可以手动去掉这种优化: //

    2.4K30
    领券