Motoko では, オブジェクトはローカルな状態 (var- 束縛された変数) とそれにアクセスして更新する public なメソッドを一つのパッケージに入れて, カプセル化したものです.

In Motoko, an object may encapsulate local state (var-bound variables) by packaging this state with public methods that access and update it.

他の型付け言語同様, Motoko のプログラムでオブジェクトとしてカプセル化できることは抽象型としての恩恵があります.

As in other typed languages, Motoko programs benefit from the ability to encapsulate state as objects with abstract types.

しかし可変状態を持つ Motoko オブジェクトは 共有可能ではありません. これはセキュリティを指向する重要な設計上の判断です.

However, Motoko objects that include mutable state are not shareable, and this is a critical security-oriented design decision.

もし共有可能, つまり概念上可搬なオブジェクトのコードをアクタ間で移動でき, 遠隔で実行できるのだとしたら, それはセキュリティ上のリスクになりますし, 遠隔のロジックと状態を共有できるとしても, それはまた別のリスクとなります. (特別な副条件としてオブジェクトが純粋なレコード型ならば, 可変状態をもたないので 共有可能 になります)

If they were shareable, that would mean either conceptually moving a mobile object’s code among actors and executing it remotely, a security risk, or sharing state with remote logic, another security risk. (Notably, as a subcase, objects may be pure records and those are shareable, since they are free from mutable state.)

この必要な制約を克服するために, アクタ ・オブジェクトは 共有可能 ではあるけれど, 実行は常に遠隔で行うこととします. アクタ・オブジェクトは Motoko の共有可能なデータとのみ通信します。ローカル・オブジェクト同士はより制約の少ない方法で相互作用し, Motoko のデータを (他のオブジェクトを含む) それぞれのオブジェクトのメソッドに渡すことができます. 他のほとんどすべての点で, ローカル・オブジェクト (とクラス) はアクタ・オブジェクト (とクラス) から共有性を取り除いたものと考えられます.

To compensate for this necessary limitation, actor objects are shareable, but always execute remotely. They communicate with shareable Motoko data only. Local objects interact in less restricted ways with themselves, and can pass any Motoko data to each other’s methods, including other objects. In most other ways, local objects (and classes) are non-shareable counterparts to actor objects (and classes).

可変状態 では, var- 束縛された変数と (可変な) 配列割り付けの形式で, プライベートな可変状態の宣言を導入しました. この章では, 可変状態を用いた簡単なオブジェクトを実装しますが, それはオブジェクト指向プログラミングにおけるオブジェクトの実装とだいたい同じです.

The Mutable state introduced declarations of private mutable state, in the form of var-bound variables and (mutable) array allocation. In this chapter, we use mutable state to implement simple objects, much like how we would implement simple objects in object-oriented programming.

続く章では, 例題を動かしながら説明していきます. その説明では, Motoko のプログラムの進化する過程をお見せします. オブジェクトはどれも (重要性に応じて) インタネット上の サービス に (ローカル・オブジェクトから アクタ・オブジェクトへと) リファクタリングされる可能性があります.

We illustrate this support via a running example, which continues in the next chapter. The following example illustrates a general evolution path for Motoko programs. Each object, if important enough, has the potential to be refactored into an Internet service, by refactoring this (local) object into an actor object.

オブジェクト・クラス. あるタスクを実施するために複数のオブジェクトを ファミリ としたいことがしばしばあります. 似たような振る舞いをするオブジェクトが複数あるのなら, それらを初期状態が設定可能な一つの青写真から作り出すのには理に適っています. このために Motoko は class 定義と呼ばれる, 構文上の構成子を提供しています. これによって同じ型と実装を持つオブジェクトを構築するのが簡単になります. オブジェクトに引き続いてクラスについて説明します.

Object classes. Frequently, one needs a family of related objects to perform a task. When objects exhibit similar behavior, it makes sense to fabricate them according to the same blueprint, but with customizable initial state. To this end, Motoko provides a syntactical construct, called a class definition, which simplifies building objects of the same type and implementation. We introduce these after discussing objects.

アクタ・クラス. オブジェクト・クラスが サービス (非同期的な振る舞い) を公開している場合は, それに相当する Motoko 構成子は アクタ・クラス で, オブジェクト・クラスに似た (異なる点もあるけど) 設計になっています.

Actor classes. When an object class exposes a service (asynchronous behavior), the corresponding Motoko construct is an actor class, which follows a similar (but distinct) design.

Example: The counter object

以下はオブジェクト値 counter のオブジェクト宣言です:

Consider the following object declaration of the object value counter:

object counter {
  var count = 0;
  public func inc() { count += 1 };
  public func read() : Nat { count };
  public func bump() : Nat {
    inc();
    read()
  };
};

この宣言は, counter という名前の単一のオブジェクト・インスタンス (上がその完全な実装) を導入します.

This declaration introduces a single object instance named counter, whose entire implementation is given above.

この例では, 開発者は public キーワードを使ってオブジェクト本体の中でそれぞれ宣言した三つの パブリックな 関数 inc, read, dump を公開しています. オブジェクトの本体は, ブロック式と同様, 宣言の列から成ります.

In this example, the developer exposes three public functions inc, read and bump using keyword public to declare each in the object body. The body of the object, like a block expression, consists of a list of declarations.

この三つの関数に加えて, このオブジェクトには一つの (プライベートな) 可変変数 count があります. count は現在のカウント値を保持し, 初期値は 0 です.

In addition to these three functions, the object has one (private) mutable variable count, which holds the current count, initially zero.

Object types

この counter オブジェクトは, フィールドとその型の対のリストを中括弧 {} で括った, 次のようなオブジェクト型を持ちます:

This object counter has the following object type, written as a list of field-type pairs, enclosed in braces ({ and }):

{
  inc  : () -> () ;
  read : () -> Nat ;
  bump : () -> Nat ;
}

それぞれのフィールド型は, 識別子, コロン :, そのフィールドの中身の型から成ります. ここでは各フィールドは関数なので, 射型形式 (_ → _) になっています.

Each field type consists of an identifier, a colon :, and a type for the field content. Here, each field is a function, and thus has an arrow type form (_ → _).

object の宣言中で, count 変数は public とも private とも明示的には宣言されていません.

In the declaration of object, the variable count was explicitly declared neither as public nor as private.