跳到正文
cccskills
免费在 GitHub 公开

representation-envy-refactor

Use when reviewing or refactoring code that pulls apart another object's private representation, such as raw limb/byte/slot access, slice constructors, or helper methods that expose internal storage. Guides agents to find representation envy and suggest moving behavior onto the object that owns the representation, using live-image Genie tools when working in Pharo.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md3.4 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Representation Envy Refactor

Use this skill when a change or review involves code that knows too much about another object's internal storage. The goal is to move the operation to the object that owns the representation, leaving callers to ask for intent rather than assemble internals.

Smell

Look for code outside the representation owner that:

  • Reads raw storage with selectors such as basicAt:, byteAt:, limbAt:, slotAt:, or instVarAt:.
  • Builds slices or copies from another object's internal indexes.
  • Passes raw representation into constructors, for example sign:limbs:, limbs:count:, bytes:, or similar.
  • Repeats loops like Array new: obj size. 1 to: ... do: [ :i | array at: i put: (obj rawAt: i) ].
  • Computes offsets, byte indexes, limb indexes, masks, carries, or sign-extension details for a value it does not own.

This is not automatically wrong inside low-level algorithm kernels. It is suspicious when the caller can be rewritten as a clear request to the representation owner.

Workflow

  1. Establish a green baseline before refactoring.
  2. Search for representation-shaped selectors and constructors:
    • In Genie/Pharo, use search_references, search_implementors, search_methods_like, get_method_source.
    • Search for names like basicAt:, limbAt:, byteAt:, copyFrom:to:, limbs, digits, bytes, slot, raw, from:to:.
  3. Classify each hit:
    • Owner-internal: code inside the class that owns the representation. Usually acceptable, but may still deserve a named helper.
    • Representation envy: code in another class, class-side constructor, service, or domain object that extracts or assembles internals from an object.
    • Algorithm boundary: code that must operate on raw arrays for a specific algorithm. Prefer one explicit boundary method that prepares the representation.
  4. Suggest or perform the smallest refactor:
    • Move the representation-copying or slicing operation onto the owning object.
    • Name it by intent, not storage mechanics, when possible.
    • Prefer receiver operationFrom:to: over OwnerClass operationFrom: receiver startingAt: count:.
    • Keep constructors simple; do not make them decode another instance's internals.
  5. Update callers one at a time and rerun focused tests after each step.
  6. Remove obsolete exposing methods only after all references are gone.

Example

Before:

lo := BigInt sign: 1 limbsFrom: r startingAt: 1 count: 16.
hi := BigInt sign: 1 limbsFrom: r startingAt: 17 count: limbCount - 16.

After:

lo := r copyPositiveFrom: 1 to: 16.
hi := r copyPositiveFrom: 17 to: limbCount.

The byte layout and zero trimming stay inside BigInt, which owns the packed limb representation.

Reporting

When asked to find cases, report:

  • Exact methods that look like representation envy.
  • Why each case leaks representation knowledge.
  • Whether it is safe to refactor now or should remain an algorithm boundary.
  • The next smallest test-backed refactor.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Use when modifying a Genie-backed Pharo project through the live MCP server on localhost:8087; includes project ownership, image read/change/test/save workflow, and first steps for new user projects.

中文简介正在准备中。当前显示原文说明。

KentBeck/SmalltalkGenie202026年7月20日 更新

Refactor messy Pharo code safely through the genie MCP tools, working from the live image (no files). Use for renames, method extraction, moving behavior, or general cleanup of existing code.

中文简介正在准备中。当前显示原文说明。

KentBeck/SmalltalkGenie202026年7月20日 更新

Rename Pharo methods safely through Genie's `rename_method` MCP refactoring tool. Use when a selector should be renamed while preserving behavior, updating senders and symbol references across the live image, including as one step in larger refactorings such as clarify API names, split responsibilities, or move behavior behind better messages.

中文简介正在准备中。当前显示原文说明。

KentBeck/SmalltalkGenie202026年7月20日 更新

pharo-tdd

免费

Drive a Genie change test-first through the genie MCP tools, working entirely from the live image (no files). Use when adding behavior or fixing a bug in the image — anything where a test should lead.

中文简介正在准备中。当前显示原文说明。

KentBeck/SmalltalkGenie202026年7月20日 更新

查看 KentBeck 的全部技能

报告此技能的问题