Upgrade to Pro — share decks privately, control downloads, hide ads and more …

社長が書いたクソコードたち

 社長が書いたクソコードたち

Rails Developers Meetup 2017 飛び入りLT
クソコードをクソコードとわかるようになったのは成長である
クソコードを書きたくて書いたわけではない
新しい知識知見を試そうとあがいていただけである
今日の行けてるコードが明日のクソコードかもしれない
クソコードを生み出すことを恐れず楽しんで書こう
※ただし本気のクソコードに限る

スライド中の参考リンク
WindowsにおけるRuby/Rails開発 2017 Winter
https://qiita.com/takeyuweb/items/ce3db31bd00ce8326a03
CRuby以外のRuby実装について調べたよ
https://qiita.com/takeyuweb/items/ea7b42746152f03efdaa
自宅で黙々と開発したいRailsエンジニアを募集!フリーランスもOK!
https://www.wantedly.com/projects/99879

Yuichi Takeuchi

December 09, 2017
Tweet

More Decks by Yuichi Takeuchi

Other Decks in Programming

Transcript

  1. タケユー・ウェブ株式会社は コードをよくしていきたい RAILSエンジニアを募集しています! • Railsエンジニア 一緒に開発をしてくれる方 フリーランス、社員問わず募集中 • 完全リモート前提 自宅に居ながらにしてLGTMって

    言ったり言われたりする仕事 地方在住でもOK • 完全フレックス&短時間OK 週3日から好きな日に ご興味を持っていただけましたら、ぜひお声がけください! https://www.wantedly.com/projects/99879
  2. 謎のGOOGLE MAPSラッパー(RUBY) • よくわからないActionとかいうクラスを積み上げてる。これがControllerに延々と書いてあっ た • Google Maps JavaScript APIのラッパーのJavaScriptを吐いてた。独自ラッパーの独自ラッ

    パー。 • 独自ラッパーやめろ。「これ、便利じゃね?」じゃねぇ。設計間違いなくヤバイ map = Mapper::Updater.new map.actions << Mapper::Action::CreateMarker.new(create_marker_options(member)) map.actions << Mapper::Action::SetCenter.new(:pan => true, :lat => member.lat, :lng => member.lng)
  3. INCLUDEするのにEXTENDEDな名前 • そもそもおかしな名前だけど『extend』して使うのかな?→includeしてる • prepend_before_filter でコールバックが順序に依存してるのに順序が混乱 • しかもparams書き換えてるー • いろいろ言いたいことあるけどとりあえず名前ちょっと考えようか

    module ExtendedController def self.included(receiver) receiver.send(:prepend_before_filter, :set_controller_name_on_component) receiver.send(:after_filter, :fix_unicode_for_safari) end class ApplicationController < ActionController::Base include ExtendedController
  4. 謎の継承CONTROLLER • どんなアクションがあるのかすらわからない • さらにこの親コントローラーもいろいろ継承してる、includeもりだくさん • 実体がどこにあるのかもわからない • なぜか lib

    以下においててincludeしてた • actionはそのControllerに書くのと、変にMix-in/継承使いたがるのやめようか class View::Details::Member::HogeController < View::Details::Member::Base include Search::Store scoped_access Spot end
  5. 謎の継承CONTROLLER(2) • あるページに表示するタ ブの中身 • 対応するControllerとか の情報がなぜか別の Controllerのメソッドに • 何やってるのかわからん

    • 本当に読めない • 本当に読めない(2回 言った) def tab_stores { :label => ‘お店', :component => { :controller => '/view/details/city/stores`, :action => 'index', :id => @city.id }, :index => [email protected](:conditions => ["deleted_at IS NULL"]) } end def tab_parks { :label => ‘公園', :component => { :controller => '/view/details/city/parks', :action => 'index', :id => @city.id }, :index => [email protected](:conditions => ["deleted_at IS NULL"]) } end
  6. なんかすごい多機能のSEARCHメソッド • どんな検索ができるか(オプションがあるか)も一目でわからない • 全部使ってるかも定かではない • テストもないし怖くて触れない class << self

    def search(conditions = { }) conditions = { }.merge(conditions) conditions[:order] ||= ‘count.desc’ conditions[:limit] = conditions[:limit] ? conditions[:limit].to_i : 20 conditions[:page] = conditions[:page] ? conditions[:page].to_i : 1 finder_options = { # 以下300行ぐらいconditionsをみて複雑なクエリをこねくり回すコード
  7. 読めないAREL • 当時すごく頑張って書いた(これは3年ぐらい前だから割と最近 • 素直にSQL書け memberships_table = User::Membership.arel_table plan_free =

    User::Plan.find_by(free: true) if plan_free.present? free_membership_table = memberships_table .project(Arel.sql('*')) .where(memberships_table[:plan_id].eq(plan_free.id). and(memberships_table[:paid_at].eq(nil))) .as('free_membership_table' free_membership_join_conds = users_table. join(free_membership_table, Arel::Nodes::InnerJoin). on(users_table[:id].eq(free_membership_table[:user_id])). join_sources