Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

Flash Advent Calendar 16日目 - 修飾子対応 -

Flashのクラスは通常のプログラミングと同様に修飾子が存在します。

修飾子 アクセス可能範囲
public どこからでもアクセス可能
private 同じクラス内からのみアクセス可能
protected 同じクラス、及び子クラス(継承クラス)からアクセス可能
internal 同じパッケージ内からのみアクセス可能

でも、JavaScriptにはpublicしか存在しない。。。

どうやって制御したものか・・・

swf2jsのクラスにはFlashが定義した関数とそれを実現する為の関数が存在してます。
packageクラスの変数や関数を追加すると混沌としたクラスになってしまうので、まずは別空間を準備しようと思います。

ActionScript3.0仕様書

仕様書を見る限り、変数や関数はtraitに格納されています。
別空間として、traitを格納先として利用しようと思います。
そして、必要になったタイミングでクラスの別空間に格納して利用すれば実現できるのではないかと思いました。

別空間を準備する

各クラスが拡張されてもいいようにObjectクラスに
variables という空間を準備してMapクラスのkey-valueで管理をする。

修飾子 アクセス可能範囲
public そのままの名前を利用
private クラスにナンバリングを行い、id_名前で管理する
protected クラス===JSのクラスか、クラス instanceof JSのクラスで判定して通過すればそのままの名前で管理
internal namespaceが存在するので、namespace_名前で管理する

public

// 取得
variables.get(name);

// 配置
variables.set(name, value);

private

// 取得
if (package.id === scope.packageId) {
    variables.get(package.id +"_"+ name);
} 

// 配置
if (package.id === scope.packageId) {
    variables.set(package.id +"_"+ name, value);
} 

protected

// 取得
const package = getPackage(namespace);
if (scope instanceof package) {
    variables.get(name);
} 

// 配置
if (scope instanceof package) {
    variables.set(name, value);
} 

internal

// 取得
if (scope.namespace === trait.namespace) {
    variables.get(trait.namespace +"_"+ name);
} 

// 配置
if (scope.namespace === trait.namespace) {
    variables.set(trait.namespace +"_"+ name, value);
} 

サクッと書いたのですが、思いつくまでが凄く大変だったのですが
思いついてしまえば、とてもシンプルな構成になりました。

ただ、public以外は判定式が入るので、どうしてもオーバヘッドが発生してしまいます。
ここは今も頭を抱えてるポイントです...。
何かいい案がある方は是非、コメントいただければ嬉しいです:bow:

明日は紀平さん(@tkihira)の「知られざる globalCompositeOperation テクニック」です!!
凄く楽しみにしていたので、是非一読頂ければと思います!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?