关于屎山代码

业务逻辑代码有时候会成为接手的人觉得特别差的屎山代码。
多为以下原因:

  • 第一手实现者,或因为能力或思考不足,设计实现问题
  • 经多人经手,需求反复改,或赶deadline,先让功能工作起来,后期也没时间再优化

可能我们因为一些需求会需要修改屎山代码,个人经验,做优化的时候,步子不要迈太大,特别是遇到屎山代码的时候。不要一次优化原本内容,还同时也把看起来顺手就可以改的业务逻辑也优化了。特别是一些tricky代码,改了容易出一些特定条件的bug。还是分开一步步做比较好。

我不是说应该有屎山代码或为其辩护,只是说我们应该正确看待。
程序员应该还是要提高对自己的代码要求。但世间的事却又事多元化,就如当前语境下“圣母”带有贬义一样。

听说全球大公司微软内部也有一堆很多Could work但是程序员不想碰的屎山代码。

UE4迭代器删除元素

在一个Unreal Engine的项目中,发现TArray<AActor>迭代器循环,actor::destroy会在数组中移除该元素,和element.remove()一样, 引起迭代器失效,很奇怪。经调查原来是因为在Actor::endplay里代码把自身从数组中移除了。我因为之前没有在迭代器里删除过元素,在查这个Bug过程中,我看了下数组Remove的代码。

TArray Remove Implementation

C++ vector::erase操作删除一个元素会导致后面所有的元素都会向前移动一个位置,这些元素的地址发生了变化,所以当前位置到容器末尾元素的所有迭代器全部失效。

这里,由于移除元素,移除元素后面的元素都向前移动,所以导致第二个元素3无法被移除掉。