1

ここで得られたスタックオーバーフローに関するいくつかの良いアドバイスに基づいて、さらにガイダンスが必要です。関心の分離は、コードをきちんとモジュール化した状態に保つために重要であると言われましたが、そうであることがわかりました。

私の質問は次のとおりです。SOC について読んだ内容に基づいて、2 つのクラスを作成しました。仕入先クラスと Csv クラス。サプライヤーは、さまざまなサプライヤーに関するデータベースからデータを取得するだけです。Csv クラスは、インポートされている csv ファイルからデータを取得し、それを解析するために必要なすべての情報を取得します。最終的な目標は、データを Supplier テーブルに挿入することです。csv データをデータベースに挿入するという目標を達成するには、両方のクラスのメソッドを使用する必要があります。ImportSuppliersCsv のような名前の 3 番目のクラスを作成する必要がありますか?それとも、Suppliers クラスのメソッドとしてインポート関数を作成する方が理にかなっていますか?

スペースを節約するために短縮すると、私のクラスは次のようになります。

class Suppliers
{


    public $db;
    public $inv;
    public $table;


    public function __construct (PDO $db)
    {

        $this->db = $db;
        $this->inv = 'lightsnh_inventory';
        $this->table = 'suppliers';

    }


    public function getSuppliers() 
    {               

        $sql = 'SELECT * FROM `'.$this->inv.'`.`'.$this->table.'`';
        $statement = $this->db->query($sql);
        $result = $statement->fetchAll(PDO::FETCH_ASSOC);

        return $result;

    }


    public function getActiveSuppliers() 
    {               

        $suppliers = $this->getSuppliers();     
        $active = array();      
        foreach($suppliers as $supplier) {

            if($supplier['exclude'] == 0)           
                    $active[] = $supplier;

        }

        return $active;

    }


    public function getDistributors() 
    {               

        $suppliers = $this->getSuppliers();     
        $distributors = array();        
        foreach($suppliers as $supplier) {

            if($supplier['type'] == 1)          
                    $distributors[] = $supplier;

        }

        return $distributors;

    }



    class Csv
    {


        public $form;


        public function __construct($form_name)
        {

            $this->form = $form_name;

        }


        public function getFile()
        {

            if(isset($_POST[$this->form.'-upload-submit'])) {

                return $_FILES[$this->form.'-file'];

            }

        }


        public function getName()
        {

            $file = $this->getFile();
            return $file['name'];

        }


        public function getExtension()
        {

            return end(explode('.',$this->getName()));

        }


        public function getType()
        {

            $file = $this->getFile();
            return $file['type'];

        }   etc.....
4

2 に答える 2

0

ない。OOP/SoC/DIなどは目的ではなく手段です。SoC の目的は、メンテナンスを容易にするモジュラー アーキテクチャです。PHP で優れた設計を考え出す最善の方法は、まずそれを機能させてからリファクタリングすることです。時間を節約するために、最初に想像の中でこれを行うこともできます。最適な方法で整理してください。結局のところ、コードを維持しようとしている人は誰でも簡単に自分の道を見つけられるようにすることが目的です。つまり、オーバーエンジニアリングに注意してください。

あなたの例では、それが1か所でしか使用されない場合、何かのクラスを作成する必要はありません。例として: 通常、CSV レコードをデータベースにインポートできるアプリケーションには、そのような行を編集するためのフォームもあります。そのため、Suppliers クラスに「保存」機能があると仮定します。 - キャッシングなし、WHERE 句なし、SQL インジェクションなど)。現在、CSV ファイルをインポートする際の問題は、この「保存」機能にデータを整然と提示する問題です。

さて、CSV ファイルをデータベースにインポートするための基本的なコード自体は、次のように単純です。

$data = array_map( 'str_getcsv', explode("\n", file_get_contents( $filename ) ) );
$columns = array_shift( $data );
$sth = $db->prepareStatement( "INSERT INTO suppliers( " . implode( ',', $columns )
  . ") VALUES ( " . substr(str_repeat(",?",count($columns)),1) . ")"
);
foreach ( $data as $line )
  $sth->execute( $line );

通常、これはそれほど理想的ではありませんが、本質的にはこれがコア機能です。CSV の解析、フィールドのマッピング、データベースの更新、および効率性/一貫性 (準備済みステートメントを使用) の 4 つのステートメント、つまり 4 つの懸念事項のみです。

OOP は依然として関数型プログラミングに依存しています - 機能別に整理します。上記は、cron ジョブまたは Web ページによって呼び出されるスクリプトのままにすることができます。これらのタスクで再利用するために、関数「import_csv」に入れることができます。しかし、それをクラスに入れるのはやり過ぎです。SoC は、ファサードまたはインターフェイスも利用します。関数はまさにそれであり、必要に応じて簡単にクラスにグループ化できます。必要なのは関数 import_csv( $filename, $profile ) だけです。$profile は、テーブル (またはテーブル)、列のマッピングなどを示します。それらを分離することで、一般的な CSV から DB へのマッピング エディターを作成できます。または、少なくとも、構成を変更するだけで、任意の CSV ファイルを任意のテーブルにインポートできます。すべてのクラスを作成すると、インポートする必要がある CSV ファイルごとに 1 つのクラスを作成することになります。

データに関係なく、代わりに汎用インポーターを想像してください。それがコードであるため、機能に焦点を当てます。これは、コードがデータベース構造に依存しないため、はるかに優れたアプローチです。($table->save() ができるように、パブリック インターフェイスで Table 基本クラスを拡張することにより) 既に抽象化されています。CSV を抽象化するのではなく (コードの最初の行が示すように、価値がありません)、マッピングを抽象化します。

これはあなたが期待した答えではありませんが、あなたが質問として提起したので、あなたが与えた答えになりたくないのは確かです.

于 2015-01-15T02:42:17.443 に答える
-1

CSV から新しいサプライヤーを挿入するために、新しいクラスは必要ありません。新しいメソッドを追加して、それに Csv オブジェクトを渡すだけです。このようにして、サプライヤ関連のすべてのアクティビティが 1 つのクラスにカプセル化されます。

または、CSV 以外の他の情報源を持つことを計画している場合は、サプライヤー メソッドが CSV オブジェクトではなく、解析された情報を受け入れるようにすることができます。

于 2013-04-09T07:14:15.423 に答える