ConohaVpsを使ってみる【初めてのVPS】

Conohaにて、初めてのVPSに挑戦。メモ的な備考録です。

staticメソッド・変数

1)インスタンスを作らなくても呼び出せる(new しなくても呼び出せる)
2)複数のところから呼ばれた場合は全ておなじ場所(メモリ)が参照されることになるので、ある所で変数の値を変更されたら他に参照しているところ全てに影響が出る

【用途】

・共通関数を定義する場合
・共通定数を定義する場合
・複数クラス間で共通の値を共有したい場合

                                                                                                        • -

public class StaticSample {

//staticメンバ変数
public static String val = "hoge";

//staticメソッド
public static int add(int a, int b){
return a + b;
}
}

                                                                                                        • -

int b = StaticSample.add(10, 20);

                                                                                                        • -

Interfaceとは

インターフェースは「このクラスは、○×△メソッド(≒関数)を持ちます!」という「約束」

・インターフェースによるメソッドの実装強制という約束をすること
・インターフェースの役割は「ふるまい」の共通化。コードの再利用ではない

例)動画再生インターフェイス

Interface videoplayer{

    //動画を再生するメソッド
    public void play();

    //動画を停止するメソッド
    public void stop();

}

//h264再生クラス

class h264player implements videoplayer{

    //動画を再生するメソッド
    public void play(){

    }

    //動画を停止するメソッド
    public void stop(){

    }

}

//Mainクラス

class Main 

{
public static void main(String[] args)
{
    h264player player = new h264player ();
        player.play();
    }
}

 

設計モデルの作り方

1)依存性、複雑さ、責任の分割に注意し設計を行う

2)メトリックスやデザイン・レビューを行い、問題点や改良点を洗い出す

メトリックスの基本的な考え方

それぞれのクラスが正しく責任を分担しているか?
個々のクラスが複雑過ぎる構成になっていないか?
それぞれのクラスの関連が複雑になっていないか?


3)その結果を基にリファクタリングを実行し、モデルを推敲する

リファクタリングを必要とするコードから感じられる雰囲気
http://objectclub.jp/technicaldoc/refactoring/refact-smell


4)メトリックスやデザイン・レビューを行い、問題点が解消していることを確認する

 

デザインパターンの基本

はじめに

1)オブジェクト指向とは

1-1)「オブジェクト」を「クラス」から作り、「オブジェクト」同士を相互作用させる

例)

  • 自動販売機クラスに、「お金が入れられると、ジュースを出す」というメソッドを持たせ、自動販売機A(object)を作る。
  • 人間クラスに、「お金を支払う」というメソッドを持たせ、人間A(Object)を作る。
  • 人間A(object)が自動販売機A(object)でジュースを買う。
    →人間Aクラス:お金を払う処理
    自動販売機クラス:お金を受け取りジュースを出す処理

1-2)メリットとして「クラス単位で再利用性」が向上する

  • 再利用性が向上する→生産性・コードの信頼性が上がる
  • 再利用性を向上させるために、「再利用性の高いクラス設計」をする必要がある

2)デザインパターンとは

オブジェクト指向で開発を行なう際に、再利用性の高い設計をするための考え方

3)デザインパターンの利用

記載中

振る舞いに関するパターン

Iteratorパターン

for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}

 上記処理で使用されているループ変数iの役割をパターン化したものが、「Iterator パターン」。つまり、「Iterator パターン」とは、ある集合体の要素1つ1つに、順次アクセスする方法を提供するパターン。

【利用するべきパターン】

  1. アプリケーション固有なデータ、構造を持ったオブジェクトにアクセスをする場合
  2. 配列やコレクションなどの集合する要素にアクセスする場合
  3. (配列はforループで回せるが、リストなどのコレクションは難しかったりする)
  4. 集合の要素に順次にアクセスする必要がある場合

 

【目的】

集合体を作成するクラスに変更があった場合も、利用する側は、変更しなくて済む


構造に関するパターン

Adapter パターン(Wrapperパターン)

※既存のクラスメソッドの再利用
dapterパターンは、インタフェースに互換性の無いクラス同士を組み合わせることを目的としたパターン。
2つのメソッドのインタフェースの違いを吸収してやる Adapter を準備することで、少ない変更で新しいメソッドに乗り換えることができる

・ Adapter パターン、2つの方法。
1)継承を利用した方法
=>interface
2)委譲を利用した方法
=>abstract class 

Bridge パターン

1)「機能追加」
スーパークラスが持っていない機能をサブクラスで追加)を目的としたもの
2)「機能実装」
スーパークラスで定義したインタフェースをサブクラスで実装)を目的としたもの

 

 

ECCUBE2.13 同一ドメインのECCUBE外ページでユーザーログイン情報を使う

ドメイン/folder/にECCUBEをインストールしている場合

shop/data/class/sessionfactory/SC_SessionFactory_UseCookie.php
session_set_cookie_params(0, ROOT_URLPATH, DOMAIN_NAME);

session_set_cookie_params(0, "/", DOMAIN_NAME);

Cookieの削除が必要

 

 

 

 

【ECCUBE2.13】商品種別を使わず配送方法等を処理分け

商品種別で配送方法等を処理分けすると同時購入が出来ないので、強引に処理分け。

1)処理分け用のフラグを商品情報に追加
商品ステータス(ProductStatus)を使用していなかったため、転用。
※商品ステータスにメール便を追加

2)商品ステータスをカートセッションに追加
[FILE]: data/class/pages/products/LC_Page_Products_Detail.php

public function doCart()
    {
        $objCustomer = new SC_Customer_Ex();

        $this->arrErr = $this->lfCheckError($this->mode, $this->objFormParam,
                                            $this->tpl_classcat_find1,
                                            $this->tpl_classcat_find2);

        //商品ID取得
        $this_product_id = $this->objFormParam->getValue('product_id');
        //商品ステータス取得
        $objProduct = new SC_Product_Ex();
        $getProductStatus_arr = $objProduct->getProductStatus($this_product_id);
        $thisProductStatus = $getProductStatus_arr[$this_product_id]['0'];

        if (count($this->arrErr) == 0) {
            $objCartSess = new SC_CartSession_Ex();
            $product_class_id = $this->objFormParam->getValue('product_class_id');
            $objCartSess->addProduct($product_class_id, 
                $this->objFormParam->getValue('quantity'),
                //商品ステータスをセッションに追加
                $thisProductStatus
            );

            // 開いているカテゴリーツリーを維持するためのパラメーター
            $arrQueryString = array(
                'product_id' => $this->objFormParam->getValue('product_id'),
            );

            SC_Response_Ex::sendRedirect(CART_URL, $arrQueryString);
            SC_Response_Ex::actionExit();
        }
    }

[FILE]:data/class/SC_CartSession.php

public function addProduct($product_class_id, $quantity,$product_status="")
    {
        $objProduct = new SC_Product_Ex();
        $arrProduct = $objProduct->getProductsClass($product_class_id);
        $productTypeId = $arrProduct['product_type_id'];
        $find = false;
        $max = $this->getMax($productTypeId);
        for ($i = 0; $i <= $max; $i++) {
            if ($this->cartSession[$productTypeId][$i]['id'] == $product_class_id) {
                $val = $this->cartSession[$productTypeId][$i]['quantity'] + $quantity;
                if (strlen($val) <= INT_LEN) {
                    $this->cartSession[$productTypeId][$i]['quantity'] += $quantity;
                }
                $find = true;
            }
        }
        if (!$find) {
            $this->cartSession[$productTypeId][$max+1]['id'] = $product_class_id;
            $this->cartSession[$productTypeId][$max+1]['quantity'] = $quantity;
            $this->cartSession[$productTypeId][$max+1]['cart_no'] = $this->getNextCartID($productTypeId);
            //商品ステータスを追加
            $this->cartSession[$productTypeId][$max+1]['product_status'] = $product_status;
        }
    }

3)ステータスによる配送方法の条件設定
※今回はメール便に関する設定
以下の条件をどちらも満たす場合メール便の利用が可能
メール便対象商品のみがカートに入っている
・カート内の商品合計数が4個未満

[FILE]:data/class/pages/shopping/LC_Page_Shopping_Payment.php
public function action()内
$objPurchase->verifyChangeCart($this->tpl_uniqid, $objCartSess);の下あたり

        //メール便不可フラグ
        $mailPost_delive = true;
        //メール便個数
        $sum_pr_quantity = "0";
        //商品ステータス取得
        foreach ($objCartSess->cartSession as $arr_cartSession) {
            foreach ($arr_cartSession as $value) {
                if(!empty($value['price'])){
                    //個数取得
                    $pr_quantity = $value["quantity"];
                    //商品ステータス取得
                    $pr_status = $value["product_status"];
                    //商品ステータスが空(ステータス指定なし)のものがあればFalse
                    if($pr_status == ''){
                        $mailPost_delive = false;
                    //商品ステータスが1(メール便)のものがあれば合計数をチェック
                    }elseif($pr_status == '1'){
                        $sum_pr_quantity = $sum_pr_quantity + $pr_quantity;
                    }
                }
            }
        }
        //合計個数が4個以上ならメール便不可
        if($sum_pr_quantity > 3){
            $mailPost_delive = false;
        }
        //配送方法一覧取得
        $this->arrDeliv = $objDelivery->getList($cart_key,'',$mailPost_delive);
|php|<

[FILES]:data/class/helper/SC_Helper_Delivery.php
>|php|
    //メール便不可フラグ追加
    public function getList($product_type_id = null, $has_deleted = false,$mailPost_delive = null)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $col = '*';
        $where = '';
        $arrVal = array();
        if (!$has_deleted) {
            $where .= 'del_flg = 0';
        }
        if (!is_null($product_type_id)) {
            if (!$has_deleted) {
                $where .= ' AND ';
            }
            $where .= 'product_type_id = ?';
            $arrVal[] = $product_type_id;
        }
        //メール便不可の場合の処理
        if($mailPost_delive === false){
            //echo $mailPost_delive;
            if (!$has_deleted) {
                $where .= ' AND deliv_id != 5';
            }
        }
        $table = 'dtb_deliv';
        $objQuery->setOrder('rank DESC');
        $arrRet = $objQuery->select($col, $table, $where, $arrVal);

        return $arrRet;
    }

【ECCUBE2.13】送料無料の商品を設定する

送料無料商品を設定。
カート内の商品が全て送料無料対象であれば、送料無料。
送料無料対象外の商品を含む場合、通常の送料計算。

■変更
define(‘OPTION_PRODUCT_DELIV_FEE’, 1);
※送料無料の商品は、商品送料に0を指定。

■修正
data/class/SC_CartSession.php

        // 商品ごとの送料を加算
        $isPriceOverride = true;
        if (OPTION_PRODUCT_DELIV_FEE == 1) {
            $cartItems = $this->getCartList($productTypeId);
            foreach ($cartItems as $arrItem) {
                if ($arrItem['productsClass']['deliv_fee'] != '0') {
                    $isPriceOverride = false;
                }
                //echo $arrItem['productsClass']['deliv_fee'];
                $results['deliv_fee'] += $arrItem['productsClass']['deliv_fee'] * $arrItem['quantity'];
            }
        }
        // 配送業者の送料を加算
        if (!$isPriceOverride){
            if (OPTION_DELIV_FEE == 1
                && !SC_Utils_Ex::isBlank($deliv_pref)
                && !SC_Utils_Ex::isBlank($deliv_id)) {
                $results['deliv_fee'] += SC_Helper_Delivery_Ex::getDelivFee($deliv_pref, $deliv_id);
            }
        } else {
            $results['deliv_fee'] = 0;
        }