Monthly Archives: Ekim 2012

Yazılım ve Sistem Mühendisliği

Refactoring üstüne

Bu konu üstüne bir giriş yazısı yazmak istedim ama üstad bana söyleyecek söz bırakmamış. Buyrun önce bunu okuyun sonra da spagetti yazılmış örnek bir kod üzerinde birlikte basitce refactoring gerçekleştirelim.

Aslında konunun özü gayet basit:
“Any fool can write code that a computer can understand.Good programmers write code that humans can understand.” (Martin Fowler)

Her apta bilgisayarın anlayabileceği kodu yazabilir. İyi programcılar insanların anlayabileceği kodu yazarlar.

Kodunuz bu standarda uyana kadar refactor etmeye devam edin. :)

if($_POST['bank_id'] == 1) {
  $mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<AbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</AbankRequest>';
	$curl = curl_init();
	$options = array(
		    CURLOPT_URL             => 'http://vpos.abank.com',
		    CURLOPT_POST            => true,
		    CURLOPT_RETURNTRANSFER  => true,
		    CURLOPT_SSL_VERIFYPEER  => false,
		    CURLOPT_SSL_VERIFYHOST  => true,
		    CURLOPT_HEADER          => false,
		    CURLOPT_POSTFIELDS      => $mBankXml
		);
	curl_setopt_array($curl, $options);
	$rd = curl_exec($curl);
	curl_close($curl);
        $xmlObject = simplexml_load_string($rd);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 2) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<BbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</BbankRequest>';
	$curl = curl_init();
	$options = array(
		    CURLOPT_URL             => 'http://vpos.bbbank.com',
		    CURLOPT_POST            => true,
		    CURLOPT_RETURNTRANSFER  => true,
		    CURLOPT_SSL_VERIFYPEER  => false,
		    CURLOPT_SSL_VERIFYHOST  => true,
		    CURLOPT_HEADER          => false,
		    CURLOPT_POSTFIELDS      => $mBankXml
		);
	curl_setopt_array($curl, $options);
	$rd = curl_exec($curl);
	curl_close($curl);
        $xmlObject = simplexml_load_string($rd);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 3) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<CbankRequest>
	<terminalid>10001</termçıkış noktasıinalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</CbankRequest>';
	$curl = curl_init();
	$options = array(
		    CURLOPT_URL             => 'http://vpos.cbank.com',
		    CURLOPT_POST            => true,
		    CURLOPT_RETURNTRANSFER  => true,
		    CURLOPT_SSL_VERIFYPEER  => false,
		    CURLOPT_SSL_VERIFYHOST  => true,
		    CURLOPT_HEADER          => false,
		    CURLOPT_POSTFIELDS      => $mBankXml
		);
	curl_setopt_array($curl, $options);
	$rd = curl_exec($curl);
	curl_close($curl);
        $xmlObject = simplexml_load_string($rd);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 4) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<DbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</DbankRequest>';
	$curl = curl_init();
	$options = array(
		    CURLOPT_URL             => 'http://vpos.dbank.com',
		    CURLOPT_POST            => true,
		    CURLOPT_RETURNTRANSFER  => true,
		    CURLOPT_SSL_VERIFYPEER  => false,
		    CURLOPT_SSL_VERIFYHOST  => true,
		    CURLOPT_HEADER          => false,
		    CURLOPT_POSTFIELDS      => $mBankXml
		);
	curl_setopt_array($curl, $options);
	$rd = curl_exec($curl);
	curl_close($curl);
        $xmlObject = simplexml_load_string($rd);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
}

Ürkütücü dğeil mi ? Ama reel hayatta malesef bu ve daha da kötüleri de mevcut. Şimdi dilerseniz gelin bu kodları adım adım birlikte refactor edelim.

Öncelikle kodumuzu baştan uca incelediğimizde sayfaya post edilen banka kimliğine göre kodun belirli bir banka api sine veri göndermesi ve sonrasında isteğin sonucu başarılıysa veya başarısızsa veritabanında bir kaydın güncellenmesi gerekiyor.

Her apiye bir http isteği gönderdiğimize göre ilk olarak http isteği yapan bölümü fonksiyon haline getirelim.

/**
  Bu fonksiyon belirli bir url e 
  belirtilen veriyi post eder.

  @param string $url
  @param string $data
  @return string
 */
function sendHttpRequest($url, $data)
{
  $curl = curl_init();
  $options = array(
      CURLOPT_URL             => $url,
      CURLOPT_POST            => true,            
      CURLOPT_RETURNTRANSFER  => true,
      CURLOPT_SSL_VERIFYPEER  => false,   
      CURLOPT_SSL_VERIFYHOST  => true,            
      CURLOPT_HEADER          => false,                   
      CURLOPT_POSTFIELDS      => $data
      );                                                              
  curl_setopt_array($curl, $options);
  $response = curl_exec($curl);
  curl_close($curl);
  return $response
}

Bu değişiklikten sonra kodumuz aşağıdaki hali aldı.

if($_POST['bank_id'] == 1) {
  $mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<AbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</AbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.abank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 2) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<BbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</BbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.bbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 3) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<CbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</CbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.cbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
} elseif($_POST['bank_id'] == 4) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<DbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</DbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.dbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		$sql = 'UPDATE pos_transactions SET status=1 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        } else {
		$sql = 'UPDATE pos_transactions SET status=0 WHERE sessionid=' . $_SESSION['id'];
		mysql_query($sql);
        }
}

Farkındayım kod hala bok gibi görünüyor. Şimdi de transaction durumunu güncelleyen veritabanı sorgusu için küçük bir fonksiyon yazalım.

/**
  Bu fonksiyon pos transaction ının 
  durumunu günceller.

  @param integer transactionId
  @param int status
 */
function setTransactionStatus($transactionId, $status)
{
  $transactionId  = (int) $transactionId;
  $status         = (int) $status;
  $sqlText        = "UPDATE pos_transactions SET status={$status} WHERE sessionid={$transactionId}";
  mysql_query($sqlText);
}

Bu fonksiyondan sonra kodumuz aşağıdaki hali alacak.

if($_POST['bank_id'] == 1) {
  $mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<AbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</AbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.abank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		setTransactionStatus($_SESSION['id'], 1);
        } else {
		setTransactionStatus($_SESSION['id'], 0);
        }
} elseif($_POST['bank_id'] == 2) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<BbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</BbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.bbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		setTransactionStatus($_SESSION['id'], 1);
        } else {
		setTransactionStatus($_SESSION['id'], 0);
        }
} elseif($_POST['bank_id'] == 3) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<CbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</CbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.cbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		setTransactionStatus($_SESSION['id'], 1);
        } else {
		setTransactionStatus($_SESSION['id'], 0);
        }
} elseif($_POST['bank_id'] == 4) {
	$mBankXml = 'data=<?xml version="1.0" encoding="utf-8"?>
	<DbankRequest>
	<terminalid>10001</terminalid>
	<merchantid>904567564</merchantid>
	<username>PROVAUT</username>
	<orderid>' . $_POST['orderid'] . '</orderid>
        <amount>' . $_POST['amount'] . '</amount>
	<card>
	<no>' . $_POST['ccno'] .'</no>
	<expdate>' . $_POST['expdate'] . '</expdate>
	<cvc2>' . $_POST['scode'] . '</cvc2>
	</card>
	</DbankRequest>';
	$apiResponse = sendHttpRequest('http://vpos.dbank.com', $mBankXml);
        $xmlObject = simplexml_load_string($apiResponse);
	if($xmlObject->response == 'approved') {
 		setTransactionStatus($_SESSION['id'], 1);
        } else {
		setTransactionStatus($_SESSION['id'], 0);
        }
}

Evet kod çöplüğümüz ufaktan birşeye benzemeye başlıyor. Şimdi de API lere gönderdiğimiz istekleri fonksiyonlaştıralım.

/**
  ABank icin odeme istegi gonderir.
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */
function sendABankPaymentRequest($orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $strXml = 'data=<?xml version="1.0" encoding="utf-8"?>
    <AbankRequest>
    <terminalid>10001</terminalid>
    <merchantid>904567564</merchantid>
    <username>PROVAUT</username>
    <orderid>' . $orderId . '</orderid>
    <amount>' . $amount . '</amount>
    <card>
    <no>' . $cardNo .'</no>
    <expdate>' . $expDate . '</expdate>
    <cvc2>' . $cvc2 . '</cvc2>
    </card>
    </AbankRequest>';
  $apiResponse  = sendHttpRequest('http://vpos.abank.com', $strXml);
  $xmlObject    = simplexml_load_string($apiResponse);
  return ($xmlObject->response == 'approved') ? true : false;
}

/**
  BBank icin odeme istegi gonderir.
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */
function sendBBankPaymentRequest($orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $strXml = 'data=<?xml version="1.0" encoding="utf-8"?>
    <BbankRequest>
    <terminalid>10001</terminalid>
    <merchantid>904567564</merchantid>
    <username>PROVAUT</username>
    <orderid>' . $orderId . '</orderid>
    <amount>' . $amount . '</amount>
    <card>
    <no>' . $cardNo .'</no>
    <expdate>' . $expDate . '</expdate>
    <cvc2>' . $cvc2 . '</cvc2>
    </card>
    </BbankRequest>';
  $apiResponse  = sendHttpRequest('http://vpos.bbank.com', $strXml);
  $xmlObject    = simplexml_load_string($apiResponse);
  return ($xmlObject->response == 'approved') ? true : false;
}

/**
  CBank icin odeme istegi gonderir.
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */
function sendCBankPaymentRequest($orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $strXml = 'data=<?xml version="1.0" encoding="utf-8"?>
    <CbankRequest>
    <terminalid>10001</terminalid>
    <merchantid>904567564</merchantid>
    <username>PROVAUT</username>
    <orderid>' . $orderId . '</orderid>
    <amount>' . $amount . '</amount>
    <card>
    <no>' . $cardNo .'</no>
    <expdate>' . $expDate . '</expdate>
    <cvc2>' . $cvc2 . '</cvc2>
    </card>
    </CbankRequest>';
  $apiResponse  = sendHttpRequest('http://vpos.bbank.com', $strXml);
  $xmlObject    = simplexml_load_string($apiResponse);
  return ($xmlObject->response == 'approved') ? true : false;
}

/**
  DBank icin odeme istegi gonderir.
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */
function sendDBankPaymentRequest($orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $strXml = 'data=<?xml version="1.0" encoding="utf-8"?>
    <DbankRequest>
    <terminalid>10001</terminalid>
    <merchantid>904567564</merchantid>
    <username>PROVAUT</username>
    <orderid>' . $orderId . '</orderid>
    <amount>' . $amount . '</amount>
    <card>
    <no>' . $cardNo .'</no>
    <expdate>' . $expDate . '</expdate>
    <cvc2>' . $cvc2 . '</cvc2>
    </card>
    </DbankRequest>';
  $apiResponse  = sendHttpRequest('http://vpos.bbank.com', $strXml);
  $xmlObject    = simplexml_load_string($apiResponse);
  return ($xmlObject->response == 'approved') ? true : false;
}

Ve… kodumuzun yeni hali…

if($_POST['bank_id'] == 1) {
  $bankResponse = sendABankPaymentRequest($_POST['orderId'], 
                                          $_POST['amount'], 
                                          $_POST['ccno'], 
                                          $_POST['cvc2'], 
                                          $_POST['expdate']);
  if($bankResponse) {
    setTransactionStatus($_SESSION['id'], 1);
  } else {
    setTransactionStatus($_SESSION['id'], 0);
  }
} elseif($_POST['bank_id'] == 2) {
  $bankResponse = sendBBankPaymentRequest($_POST['orderId'], 
                                          $_POST['amount'], 
                                          $_POST['ccno'], 
                                          $_POST['cvc2'], 
                                          $_POST['expdate']);
  if($bankResponse) {
    setTransactionStatus($_SESSION['id'], 1);
  } else {
    setTransactionStatus($_SESSION['id'], 0);
  }
} elseif($_POST['bank_id'] == 3) {
  $bankResponse = sendCBankPaymentRequest($_POST['orderId'], 
                                          $_POST['amount'], 
                                          $_POST['ccno'], 
                                          $_POST['cvc2'], 
                                          $_POST['expdate']);
  if($bankResponse) {
    setTransactionStatus($_SESSION['id'], 1);
  } else {
    setTransactionStatus($_SESSION['id'], 0);
  }
} elseif($_POST['bank_id'] == 4) {
  $bankResponse = sendDBankPaymentRequest($_POST['orderId'], 
                                          $_POST['amount'], 
                                          $_POST['ccno'], 
                                          $_POST['cvc2'], 
                                          $_POST['expdate']);
  if($bankResponse) {
    setTransactionStatus($_SESSION['id'], 1);
  } else {
    setTransactionStatus($_SESSION['id'], 0);
  }
}

Eskiye oranla kodumuz oldukça kısa ve okunaklı oldu. Ancak yine de Aynı işi yapan blokların tekrar etmesi biraz can sıkıcı. Dilerseniz gelin şimdi de bankalara istek gönderen fonksiyonları tekilleştirelim ve sonuca göre bir kerede pos transaction durumumuzu güncelleyelim.

/**
  kimliği belirtilen bankaya ödeme isteği gönderir.

  @param int bankId
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */

function sendPaymentRequest($bankId, $orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $functionMap = array(
        1 => 'sendABankPaymentRequest',
        2 => 'sendBBankPaymentRequest',
        3 => 'sendCBankPaymentRequest',
        4 => 'sendDBankPaymentRequest'
      );

  if(!in_array($bankId, $functionMap)) {
    return false;
  }
  
  $function = $functionMap[$bankId];

  return $$function($_POST['orderId'],
      $_POST['amount'],
      $_POST['ccno'],
      $_POST['cvc2'],
      $_POST['expdate']);
}

Bu geliştirmeden sonra kodumuz son olarak aşağıdaki hali alacaktır.

$bankResponse = sendPaymentRequest($_POST['bank_id'],
    $_POST['orderId'], 
    $_POST['amount'], 
    $_POST['ccno'], 
    $_POST['cvc2'], 
    $_POST['expdate']);
if($bankResponse) {
  setTransactionStatus($_SESSION['id'], 1);
} else {
  setTransactionStatus($_SESSION['id'], 0);
}

Berker’in comment’inden sonra gelen edit:

$bankResponse = sendPaymentRequest($_POST['bank_id'],
    $_POST['orderId'], 
    $_POST['amount'], 
    $_POST['ccno'], 
    $_POST['cvc2'], 
    $_POST['expdate']);
setTransactionStatus($_SESSION['id'], (int) $bankResponse);

Göktuğ’nun comment’inden sonra sendPaymentRequest() fonksiyonuna gelen edit:

/**
  kimliği belirtilen bankaya ödeme isteği gönderir.

  @param int bankId
  @param string $orderId
  @param float $amount
  @param string $cardNo
  @param string $cvc2
  @param string $expDate
  @return boolean
 */

function sendPaymentRequest($bankId, $orderId, $amount, $cardNo, $cvc2, $expDate)
{
  $functionMap = array(
        1 => 'sendABankPaymentRequest',
        2 => 'sendBBankPaymentRequest',
        3 => 'sendCBankPaymentRequest',
        4 => 'sendDBankPaymentRequest'
      );

  if(!in_array($bankId, $functionMap)) {
    return false;
  }

  return $functionMap[bankId]($orderId,
      $amount,
      $cardNo,
      $cvc2,
      $expDate);
}
Genel

Goygoy Yönelimli Programlama (GGOP)

Evet… Gelen yoğun istek üzerine bu konu hakkındada bir blog yazısı yazmak şart oldu.

Goygoy yönelimli programlama yaklaşımı, umumiyetle yurtdışındaki bazı büyük yatırım şirketleri veya popüler elektronik ticaret şirketlerinin güzel yurdumuzdaki seçkin şirketlere yatırım yapması ve bu şirketlerdeki çalışma şartlarının yıllardır patron baskısı altında ezilen yağız Türk developerının alışkın olmadığı bir level e gelmesiyle başlamış, son derece geniş ve lakayit bir programlama biçimidir.

Goygoy yönelimli programlama yaklaşımının hakim olduğu şirketlerde :

– Mutfak, kahve makinesi, oyun odası, langırt masası ve oyun konsolu gibi ekipman ve imkanlar mevcuttur.

– IK tarafından belirlenen mesai saatler, öğlen arası ve kılık kıyafet yönetmeliği gibi kurallar olmasına karşın IT cephesinde “Bu kurallar IT yi kapsamaz” anlayışı hakimdir. O gün mesainin kaçta başlayacağı veya öğlen arasının ne kadar süreceği gibi konular developerdan developer a değişgenlik gösterebilir. Ancak herkes çıkış saatine riayet eder.

– Örneğin GGOP uygulanan ve mesai saatleri 9:00 – 12:00 13:00 – 18:00 olan bir şirketteki tipik bir işgünü:

09:45 – 10:15 : Ayılma, adaptasyon kahvaltı, çevre arkadaşlarla goygoy.
10:15 – 11:25 : Jiradaki işlere şöyle bir göz gezdirilir. IDE açılır. Projeden yalandan bir iki tane dosya ekrana getirilir. 5-10 dk. amaçsız bir şekilde scroll çubğu yukarıdan aşağıya, aşağıdan yukarıya gezdilir durulur. Maksat leadler işte görsün.
11:25 – 11:35 : Çay, kahve, goygoy…
11:35 – 11-58 : “- Kanka iki tur pes atakda joystiği kolunun altına vereyim.” muhabbeti.
11:58 – 12:15 : “-Beyler ne yiyoruz bugün ?”, yemeğe hazırlık, toplaşma…
12:15 – 13:30 : Öğle arası (Toplaşmayı saymazsak zaten 12 de çıkmadığımız için geç gelme hakkını otomatik olarak elde ediyoruz.)
13:30 – 14:10 : PES / langırt / goygoy arası
14:10 – 15:30 : Yalandan kodlar incelenir, belki bir tane issue çözülür.
15:30 – 16:15 : Mevcut sistem, projenin bir bölümü veya tamamı ya da şirketin işleyişiyle ilgili aksaklıklar hakkında goygoy yapılır.
16:15 – 17:10 : PES/Langırt/GoyGoy/Sigara
17:10 – 18:15 : Gün içerisinde ite kaka yalandan yapılan issue lara ait kodlar deploy edilir. Kodlar patlar, bugfix yapılır, birdaha deploy edilir, birdaha patlar, birdaha bugfix yapılır… Bir yandan bugfix yapan yağız Türk developerı bir yandan koca günde ite kaka yaptığı o kıytırık iki issue ile ilgili olarak “Lan kendi yazdığım kodu nasıl test edeyim…!” şeklinde söylenmeye devam eder.
18:15 – 18:30 : Sigara / kahve molası
18:30 – <belirsiz>: Gün içinde yapılmayan işler için mesaiye kalınır. Yiyecek/içecekler şirketten.

– Her işin deadline ı vardır. Ancak kaynak yetersizliğinden (mevcut kaynak goygoya kanalize olduğundan) deadline hedefleri genellikle tutmaz.

– Sigara kahve tüketimi insani ölçülerin üzerindedir.

Bunun gibi birsürü özelliği sıralayabiliriz.

GGOP uygulanan yerlerde bir nevi çan eğrisinin uygulandığını söyleyebiliriz. Belirli goygoy performansını gösteremeyen developerlar, mesainin tamamına yakınını bilgisayardan kafasını bile kaldırmadan, tek kelime konuşamadan kod yazarak geçirmeye mahkumdurlar. Ayrıca evlerine zamanında gidebildikleri de pek görülmemiştir. Zaten böyle çalışan şirketlerde yönetimin Y sinden de söz edilemez. İyi bir developersanız, çalıştığınız şirkette GGOP uygulanıyorsa kaynak kullanımında denge diye birşey sözkonusu olmadığından “Zevkle çalışanı şevkle… ” felsefesi hakimdir. Allah böyle şirketlerin de buna vesile olanın da bu yaklaşımı sürdürenin de… diyorum başka da birşey demiyorum!!!