エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

読みやすいプログラムを書くために。否定の変数名の言い換え【637日目】

学んだこと

その後のコードで反転する目的で、 $is_xxx $has_xxxを変数をつけるなら、$is_not_ $has_notを変数名をつけるのも手

is_not_xxx は、(is not)xxxか、is(not_xxx)とどちらで解釈するか迷うので、最善手とは限らない

xxx_items_are_emptyなど、反対の意味の単語を使うことも出来るが、主語を間違えると意味を間違えやすい

変数に逆の意味をつけたい

$has_user_item = !($items->where('item_type', 'user')->empty());

if (!$has_user_item) {

userのものを持っていない。それを反転すれば持っているって値になる。
でも、否定の否定が入って、式が見にくい・・・?

noやnotで反転させる

$has_no_user_item = $items->where('item_type', 'user')->empty();

変数名にnotやnoを入れる。
とはいえ、変数名にnotとか入れるとますます混乱しかねないので、
コード全体が否定の意味を求めているとき以外は使わないほうが良さそう。

逆の意味を示す単語を使う

$user_item_is_empty = $items->where('item_type', 'user')->empty();

存在していない、という単語を使いたければ、空であるという言い方をする。

否定の意味を含んだ単語を使うことで、文自体を肯定文にする。

とはいえ、主語が難しくなるので注意しましょうφ(・

読みやすいプログラムを書くために。式を一度変数に入れる。【636日目】

私がコードを書いたときに頂いたアドバイス

コードを読みやすくすために式に名前を付けるという意味で変数に入れるのは良い

(正しくは、変数に結果を入れていますが、結果と捉えるより式と捉えるほうがわかりやすいと考え、あえて式と表現します。)

読みにくいコード

if (!($user->where('item', 'x')->isEmpty())) {
    $this->xxxx();
}

まだこのコードは読みやすい方ですが・・・

ぱっと見で何をしているコードがわかるでしょうか。

もし、if文の中身がもっと長かったら目も当てられない・・・

変数に入れることで『名前付けをする』

$has_x_item = !($user->where('item', 'x')->isEmpty());

if ($has_x_item) {
    $this->xxxx();
}

こうすることで、if文の中身がどのような意味を持っているかわかりやすいですね。
以下の文だけを見ても何が起こっているかわかりやすいです。

if ($has_x_item) {
    $this->xxxx();
}

一見、変数に入れる処理が邪魔と思うかもしれません。
無駄と思うかもしれません。

でも、『どんな式か』がわかりやすくなるのは、後の開発者が見たときの開発速度に繋がります。

幸い今の時代はこれくらいの処理を詰めるほどメモリ等がカツカツではないので・・・!

コメントを入れればいいのでは?

// ユーザーがxを持っているか確認して、処理を行う
if (!($user->where('item', 'x')->isEmpty())) {
    $this->xxxx();
}

これも一つの手だと思います。
日本語読めない人にはコード読めなくなりますが・・・

コードの拡張(&&等で条件増やしたり)の度に条件式を拡張していくと、コードがさらに見にくくなるので・・・
そういうときは、一個の意味の単位で変数に入れていくのは良いと思います。

【思考メモ】本音を完全に引き出せなくてもいいけど、建前をそのままにしない【635日目】

思考メモ

今日いろいろ気づきあったので、誕生日とかそっちのけで思考メモφ(・

思ったこと

相手が本音じゃないかもしれない。

そんなのを今まで全く気にしてなかったし、なんならわざと気にしてない節もあった。

でも、そうではいけないのかもって思ったφ(・

起こったこと

相手の建前上、こう言わなければいけないって場面がありました。
そして、私はそのまま受け取りました。

しかし、友人がそうじゃないんじゃないか、建前じゃないかと判断して、
ヒアリング・誘導して、別な意見が出てきました。

そのMTGの私の目的は『メンバーが望むものを作る』って目的だった場合、
その建前を建前のままにすると、私の目的が達成出来ない。

これは建前を建前のままに受け止めてはいけない、このままにしてはいけないと思いましたφ(・

それは、作り上げたものが、結果的に思ったものとは違うってことに『陥りやすいのではないか』って判断からです。

本音を引き出さなくてもいいとは?

『本音を引き出す』のは目的じゃないから。

最終的に、相手が望むものを作れたら良い。
そのときに、相手側も実は言いたいけど言わないほうがいいと判断して言わない場合もあるかもしれない。
これが本音ですね、なんて言えないし。

さらに、本音もある瞬間での本音が、次の瞬間本音じゃなくなる可能性もある。

だから、本音を引き出すってのが目的ではないはず。
とはいえ、やりたいことって本音に近づけることだから、問題ないなら引き出すが一番いいのですがφ(・

建前をそのままにしない手段とは?

やり方の一つ。

もし、相手が『こういう立場で発言する以上、立場に基づいた建前を言う必要がある』場合。

  1. 立場を持って発言しなければいけない場を取り払う
  2. もし、あなたがその立場でなかったら?個人的には、どうしたい?と聞いてみる

という手段があるかもしれないφ(・

段階を分けて崩す?

ちょっと私完全には理解してないけど、手段としてあるのかな?ってやつ。

叩きのめすのではないが、相手を崩す。
建前を引き出し、それは違うよと一旦否定出来るようにする。
その後に続く言葉から目的のものを引き出す。

『建前を言わないで良い』『建前は一度言った』状態を作るのは、建前の効力をなくすことでも作れる・・・のかもしれないφ(・

【Laravel】すでにDBから取得したCollectionを絞り込むwhere関数【634日目】

データを絞り込みたい

// データの取得
$x_item = Xitem::get();
$this->aFunc($x_item);

// $x_itemの中で条件が合致したものだけ行う処理

こんなふうに、一度データベースから取得したデータの内、一部だけを利用してデータを操作したい。

このときに、クエリを再発行して再取得する方法もあるが、SQL節約したり、データがその間変わっているのを恐れるなら、
取得後のデータを絞り込みたい

where関数whereIn関数等

データベースから get関数などで取得したデータはCollectionと呼ばれる、ちょっとリッチな配列に格納される。

そのCollectionには便利な関数がいくつかあります。
(DBから取得する以外で生成されたCollectionでも使えます)

// データの取得
$x_item = Xitem::get();
$this->aFunc($x_item);

// user_idが1と2のものだけ取り出す
$items = $xxx_items->whereIn('user_id', [1,2]);

// idが1と2のものどちらかがあれば関数を実行
if (!$items->isEmpty()) {
    $this->bFunc();
}

このように、取得後もクエリを再発行せずとも、データを絞り込む事ができます。

Collectionには便利な関数が他にもあるので、クエリを再発行する必要があるか、一度考えてみましょうφ(・

【はてなブログ】任意の文字列を簡単にリンクにする方法【633日目】

リンクを作りたい

ある文字を、リンクにしたい。

手順

  1. 作りたいリンクのURLをコピーする
  2. 文字を打ち込み、shift+矢印等で選択する
  3. 選択状態でctrl+vなどで貼り付けをする

3.のときに、以下のような画面が出ればOK。

f:id:willow710kut:20190708214453p:plain

hamacoさんの悩み

ちなみに、取り消し線とか、文字を大きくしたりも出来ます。

[hamacoさんの悩み](https://twitter.com/hamaco/status/1148205701438689280)
↓
<s>[hamacoさんの悩み](https://twitter.com/hamaco/status/1148205701438689280)</s>

hamacoさんの悩み

出来ましたね!お疲れ様でした。

【一週間振り返り】CfP申請したり、遊ぶ準備したりの一週間【632日目】

1.今週一週間の感想(ざっくり)

CfP申請したのと、遊ぶのもした!

2.良かったこと

  1. ぺちこんCfP4つ出せた
  2. 久しぶりにSkyrim VRしたり、Payday2 VR初挑戦したりした
  3. お仕事もいろいろ試してみれた
  4. 誕生日(7/10)です!って言ったらめっちゃお祝いされた。過去最高に楽しい誕生日かもしれない。

3.もっとこうしたかったこと

そこそこ良かった気がする。

が、気づいたら私また予定を抱えている気がするよ?
自分の予定が多いかを数値化するのもありかもしれない。

4.新しく気づいたこと

  1. 遊ぶって気合いる!
  2. ネタはたくさんあれど、『自分がこの話をしたい』ってのが登壇のモチベーションらしい
  3. ほしいものリスト文化っていいね・・・

5.来週したいこと

誕生日だあああああああああ

でもお仕事だあああああああああ

ってことでお仕事がんばりまーす。
週末は遊ぶぞー!

6.その他

遊ぶのって楽しいよね。

一人で遊ぶの久々出来た(‘ω‘ )

7.体重

101.2kg

ピザ美味しいよね!ピザ食べてしまった(ノω・)テヘ
やっぱり、食べる量も考えねば。

運動はそこそこ継続中。カロリー表示機能もつけました。

【登壇準備】またPHPカンファレンス北海道・沖縄にCfP応募しました【631日目】

PHPカンファレンス北海道?PHPカンファレンス沖縄?

地方のPHPのカンファレンスです!

phpcon.hokkaido.jp

phpcon.okinawa.jp

CfP?

Call for Proposalsの略です。

簡単にいうと、登壇・発表の募集です。

運営の人達とかが、集められた登壇内容を見比べて、これにしよう!ってなって採択されたら、
当日無事に登壇が出来るというわけです!

CfP応募→待つ→結果発表!ですね。

どんなの出したの?

正しい『意味』でプログラミングをする

プログラミングって、言語なんです。

私の思いとして『日本語で説明できるものは必ずプログラミング出来る』

逆に言うと、そうじゃないと難しいと思っています。(不可能とはまだ言わない)

パーツを組み合わせるのがプログラミングというわけじゃなくて、
私が日本語を翻訳するという形でプログラミングしているのを説明したいと思います。

きっと、似たことを考えてプログラミングしてる人は多くて、
バグを抑えたりキレイにコードを書いてる人は、近い考え方をしてると思ってますφ(・

fortee.jp

エンジニアがブログや登壇で、アウトプットするとどうなる?

PHP関係ない!!!!!

なのでおまけなのですが、一応LT枠で入れてみました。
自分で言うのもなんですが、適切な場かわかりませんが、自分に一番求められてるものな気がする・・・

ってことで、とりあえず投げて、リジェクトされたらまあそうだよねーって思うことで投げてみました。

まあ、真面目なの3つは投げたので、一個くらいふざけても・・・w

楽しみですね!

4つ無事に投げました!!!!!

dockerとseleniumでE2Eテストについても、LT枠でやるのも視野にφ(・

それは、明日気分が乗ったら投げます。

ってことで、なんとしても登壇して、 会社のお金でカンファレンス行きたい皆さんに面白い話を届けたいです!

【登壇準備】PHPカンファレンス北海道・沖縄にCfP応募しました【630日目】

PHPカンファレンス北海道?PHPカンファレンス沖縄?

地方のPHPのカンファレンスです!

phpcon.hokkaido.jp

phpcon.okinawa.jp

CfP?

Call for Proposalsの略です。

簡単にいうと、登壇・発表の募集です。

運営の人達とかが、集められた登壇内容を見比べて、これにしよう!ってなって採択されたら、
当日無事に登壇が出来るというわけです!

CfP応募→待つ→結果発表!ですね。

どんなの出したの?

フレームワークの元コードを読むと得られる学びと、その方法

ってことで、みんなソースコード読もうぜ!ってやつです。
こちらは、Laravelコントリビュートはおまけで、あくまでコードを読むのが大切だよって話をします。

fortee.jp

一応、LaravelJPConferenceで話した内容も投げました。

楽しみですね!

まだネタが4つほどあるので、あと2つは出したいですねφ(・

登壇出来るように頑張りたいです(`・ω・´)ゞ