クラスモデルのアイデアを説明するために、可能な限り詳細に説明して、(うまくいけば)潜在的な答えのより良い基礎を提供しようとします。
txt ファイルまたは html ファイルのいずれかで提示される共通のレイアウトを共有するアプリケーションからのデータを解析するクラスを作成しましたが、動的データがあります。データ ハンドラーがパーサー クラスを継承するモデルでビルドしてみることにしました。
パーサー クラスはエクスポートされたデータを解析し、多次元$this->parsed
配列を作成します。次に、サブクラスがデータを処理する必要があり、データが似ていてもレイアウトが異なる場合は、他のクラスがサブクラスを継承します。この例は、1) 従業員のリスト 2) 1 人の従業員の詳細ビューです。この場合、サブクラスEmployee
は処理されたデータの多次元配列を保持し、年齢の計算などの一般的なメソッドを持っています。エクスポートされたデータは異なる方法でレイアウトされるため (ケース 1 では複数の従業員のリスト、ケース 2 では 1 人の従業員のみ) )、さらに 2 つのクラスを作成しました。
これは$this->parsed
、従業員のリストのデータ配列である可能性があります
$parsed[0][0] = Name
$parsed[0][1] = D.O.B.
$parsed[0][2] = E-mail address
$parsed[0][3] = Department
$parsed[1][0] = John Smith
$parsed[1][1] = 1980-3-5
$parsed[1][2] = john@smith.com
$parsed[1][3] = Economics
$parsed[2][0] = Jane Smith
$parsed[2][1] = 1964-1-12
$parsed[2][2] = jane@smith.com
$parsed[2][3] = PR
$this->parsed
従業員の詳細ビューのデータ
$parsed[0][0] = Name
$parsed[0][1] = John Smith
$parsed[1][0] = D.O.B.
$parsed[1][1] = 1980-3-5
$parsed[2][0] = E-mail address
$parsed[2][1] = john@smith.com
$parsed[3][0] = Department
$parsed[3][1] = Economics
データは似ているので、Parser クラスを拡張する Employee クラスがあります。
abstract class Employee extends Parser {
$handledData = array();
abstract public function Populate();
public function CalculateAge($employeePointer = 0) {
$dob = $this->handledData[$employeePointer]['dob'];
// Calculate...
}
}
また、解析されたデータのレイアウトが異なるため、$this->parsed
配列を異なる方法で読み取り、それに応じてデータを $handledData に設定する 2 つのサブクラスを使用します。
class EmployeeListView extends Employee {
public function Populate() {
array_shift($this->parsed); // Remove the "header row"
foreach ($this->parsed as $employeeArray) {
list($name, $dob, $email, $dep) = $employeeArray;
$this->handledData[] = array('name' => $name, 'dob' => $dob, 'email' => $email, 'dep' => $dep);
}
}
}
詳細ビューでも同様のプロセスを使用しますが、アイデアは明らかだと思うので、その例は書きません。
このレイアウトを使用して問題に遭遇しました。エクスポートされたデータは動的であるため、いくつかの形式で提供されます。無限ではありませんが、バリエーションの量は 100 に達することもあります。今のところ、これら 2 つのクラスValidate()
で、配列のサイズを$this->parsed
再帰的に取得し、その内容をチェックして、データがそのクラスによって処理されることになっていることを検証するメソッドを作成しました。どのクラスを使用するかを具体的に知っている限り、それはうまく機能します。ただし、アップロードするファイルに適したハンドラー クラスを見つけるために膨大な数の潜在的なハンドラー クラスのリストをスクロールするのに時間を費やすことなく、ユーザーがファイルをパーサーにアップロードできるようにしたいと考えています。
使用するサブクラスを動的に選択するにはどうすればよいですか? 私はおそらくこのようなことをすることができます:
$buffer = file_get_contents($uploadedFile);
$classes = array('EmployeeListView', 'EmployeeDetailView');
foreach ($classes as $className) {
$loadedClass = new $className();
$loadedClass->Parse($buffer);
if ($loadedClass->Validate() === true) { $found = true; break; }
}
if (!$found) { die("Unable to properly parse the uploaded file."); }
しかし、この方法は私にはあまり合いません。もっと良い方法があると確信しています。
私が自分自身を明確にしたことを願っています。