CLIの宇宙探査


私はFlatiron学校での私の最初のCapstoneプロジェクトのためにより興奮することができませんでした.目の瞬きで8週間飛んだ!
私の夫と私は最近、2014年の科学ドキュメンタリーを見たCosmos: A Spacetime Odyssey , 占星術師ニールDeGlse Tysonによって発表されます.私は、このいわゆる「想像力の船」を通してTysonの物語のアプローチに驚きます.ドキュメンタリーシリーズは、私のCLI(コマンドラインインターフェース)プロジェクトドメインモデリング、宇宙探査に貢献しました.

RESTful API検索


次の楽しい演習では、適切なデータをHTMLからスクレーピング、またはRESTful APIからリモートデータソースを取得します.私は、私が本当に好きである2つのAPIを発見しました.一つは惑星データを私に提供し、もう一方は宇宙船データを提供しました.私の最初のアプローチは、これらのリモートデータソースを取得し、私のドメインモデリング内のデータを操作することでした.
class API 

    def self.space_data
        url = 'https://...'
        uri = URI.parse(url)
        response = Net::HTTP.get_response(uri)
        response.body

        space_data = JSON.parse(response.body)["bodies"]
    end 
    # => 'json' module returns Ruby hashes with key and value pairs

    def self.planets
        planets = []

        space_data.each do |data|
            if data["isPlanet"] == true
                planets << data["englishName"]
            end 
        end 

        planets 
    end 
    # => ["1 Ceres", "136199 Eris", "Uranus", "Pluto", "Neptune",...

    def self.planet_info(name)
        space_data.detect do |data|
            if data["englishName"] == name 
                puts "Name: " + data["englishName"].to_s
                puts "  Mean Radius: " + data["meanRadius"].to_s + " kilometres"
                puts "  Density: " + data["density"].to_s + " g.cm3"
                puts "  Gravity: " + data["gravity"].to_s + " m.s-2"
                puts "  Perihelion: " + data["perihelion"].to_s + " kilometres"
                puts "  Aphelion: " + data["aphelion"].to_s + " kilometres"
                if data["discoveredBy"] != ""
                    puts "  Discovered by: " + data["discoveredBy"].to_s
                end 
                if data["discoveryDate"] != ""
                    puts "  Discovery Date: " + data["discoveryDate"].to_s
                end 
            end 
        end 
    end 
    # => self.planet_info("Uranus")
    # => Name: Uranus
    # => Mean Radius: 25362.0 kilometres
    # => Density: 1.27 g.cm3
    # => Gravity: 8.87 m.s-2
    # => Perihelion: 2734998229 kilometres
    # => Aphelion: 3006318143 kilometres
    # => Discovered by: William Herschel
    # => Discovery Date: 13/03/1781

    def self.spacecraft
        url = 'https://...'
        uri = URI.parse(url)
        response = Net::HTTP.get_response(uri)
        response.body

        spacecraft = JSON.parse(response.body)
    end
    # => 'json' module returns Ruby hashes with key and value pairs

    def self.spacecraft_info 
        spacecraft.each do |ship|
            puts ship["rocket_name"].to_s 
            puts ship["description"].to_s
            puts "  Height: " + ship["height"]["feet"].to_s + " feet"
            puts "  Mass: " + ship["mass"]["lb"].to_s + " lbs"
            puts "  Success Rate: " + ship["success_rate_pct"].to_s + "%"
        end 
        nil 
    end 
    # => Falcon 1
    # => The Falcon 1 was an expendable launch system privately developed and...
    # =>   Height: 73 feet
    # =>   Mass: 66460 lbs
    # =>   Success Rate: 40%
    # => Falcon 9
    # => Falcon 9 is a two-stage rocket designed and manufactured by SpaceX...
    # => ..

end

ドメインモデリング


3つの主要モデル(またはクラス)があります.彼らは宇宙飛行士、宇宙船、惑星です.つの主なオブジェクト関係は以下の通りです.
宇宙飛行士
宇宙飛行士は宇宙船を介して多くの惑星を訪れる
宇宙船は宇宙飛行士に属しているか、多くの宇宙飛行士を持っています
惑星に着陸する宇宙船
惑星は宇宙船に属する
惑星は宇宙船を介して多くの宇宙飛行士を持って
SpaceDevelopment ::CLIクラスは、ユーザーがドメインモデリングの中でインタフェースをするのを許容しますが、APIクラスはユーザーに対する応答を提供するのに責任があります.私は、各クラスの責任を表示する全体的な制御フローのダイアグラムを作成しました.に属し、多くの関係は、現実世界の宇宙探査を模倣しています.

旅は国際宇宙ステーションで始まる.ユーザーは、宇宙飛行士は、彼/彼女の名前と宇宙旅行の経験の年を入力します.ユーザーは別の宇宙飛行士を乗組員を追加追加するオプションがあります.3つのすぐに利用できる宇宙船選択があるでしょう.それらはSpaceX宇宙船であり、データはSpaceX RESTful APIによって提供されます.ユーザーが選択するオプションがありますPlanet , Dwarf Planet or Asteroid 目的地として.個々の惑星属性はour Solar System 銀河系銀河で.惑星の重力が0.0に等しいとき、宇宙船は着陸をすることができません.宇宙飛行士や宇宙乗組員が最初の目的地に到着すると、旅は停止しません.これは、ユーザーの現在位置に基づいて最寄りの惑星から始まる他の目的地へのオプションを旅行の連続ループされます.合計13の惑星と273の矮小惑星と/または小惑星があります.宇宙船成功率が50 %未満であるならば、スペースクルーは国際宇宙ステーションに再ルートを移して、異なる宇宙船を選ぶ必要があります.ユーザーはまた別の宇宙飛行士を追加する別のオプションがあります.ユーザーが彼/彼女の宇宙旅行を完了すると、宇宙全体の乗組員は、この任務に関与する宇宙飛行士のリストの要約記録、宇宙船を選択し、惑星を訪問し、国際宇宙ステーションに戻ります.

Ruby環境の設定


私は、ルビーを設定することを認めなければなりませんgemspec and config/environment.rb ちょっと時間がかかりました.私はいくつかのビデオチュートリアルを見て、簡単なbashコマンドを学び、基本的なRuby環境を設定する際に非常に便利になった.セットアップ./bin/console 私の即時のIRBセッションとして、それは、あらゆるクラスとインスタンスメソッドをテストする際に非常に役に立ちましたbinding.pry 特にリモートデータソースを操作するとき.彼らは私のルビーの親友になった.The ./bin/space_exploration ユーザー起動ポイント、トリガSpaceExploration::CLI.new .
私が探検したいくつかの楽しいルビー宝石があります.require_all 反復利用の代わりに役に立つrequire_relative . リモートデータソースを取得するためのいくつかの宝石はopen-uri , net/http , and json . 私は建築家です、そして、デザインは私がすることで大きな役割を演じます.私はより良いユーザーインターフェイス私は、より良いユーザー体験を提供すると信じて私のアプリケーションとの相互作用.colorize and lolize より多くの色を追加する驚くべきルビー宝石です.私は、より多くのルビー宝石柱提出を調査する予定です.
学習についてgit もう一つの個人的なマイルストーン達成.私は現在、手動でgithubに私のrepoを提出し、一般的にgitを理解して快適です.私は、時間が進むにつれてより多くのレポ提出物があるので、私のgithubレポが早く組織されるように勧められました.

コマンドラインインターフェース


API、CLI、および他のクラスを開発するときの主な課題は、責任を割り当てることでした.クラスとインスタンスのメソッドをより複雑になるにつれて間違って割り当てることがいくつかあった.それぞれのモデルやクラスにはそれぞれの動作や属性のセットがあり、それぞれの集合がどのクラスに属するかを理解するのが賢明です.再因数分解コードは、乾いた(don ' t - repeat - self)コードを維持するために、重要な毎日のルーチンになりました.モジュールは、各クラスで発生する任意の繰り返しのコードを吸収するために作成されました.それは再び再訪問する価値がある再因数分解運動でした.
プロジェクト完成を通して私の方法を猛烈にコーディングした1週間後、私は戻って、私の全体的なオブジェクト関係を再評価しました.私は自分がCLIのクラスに多大な時間を費やしていることに気づいた.これは私のコードのほとんどがあるところです.つの例は、セットアップですif / else or case / when 各種ユーザ入力の条件.無効なユーザー入力を受け取るとき、元のインスタンスメソッドに戻るために、追加のインスタンスメソッドを作成することを強制しました.これは有効なフィードバックを知覚する他の方法の論理を危険にさらすのを避けるために役に立ちます.
全体的に、私はRuby :オブジェクト指向プログラミング(OOP)を理解するより深い深さに没頭することができてうれしいです.先月私は基本的なRuby手続きプログラミング概念を把握したことを思い出します.Ruby oopは、オブジェクトの関係やアーキテクチャからメタプログラミングへの実用的なアプリケーションに強いです.私は、Flatiron学校が次に何を提供しなければならないかについて学ぶのを待つことができません.

フェンビット / 気候探査


ようこそあなたのスペースの探査には、あなたの宇宙乗組員を選択することができます、あなたの好きな宇宙船(宇宙船によって供給)を選択し、惑星の無限の量を私たちの太陽系で旅行する!


宇宙探査



スペース・トラベル
あなたのスペースの乗組員を選択することができますあなたのスペースの探査、あなたの好きな宇宙船(宇宙船によって供給)、および銀河系の惑星の無限量を選択することができますへの旅行に!
YouTube Demo

アバウト


旅は国際宇宙ステーションで始まる.ユーザーは、宇宙飛行士は、彼/彼女の名前と宇宙旅行の経験の年を入力します.ユーザーは別の宇宙飛行士を乗組員を追加追加するオプションがあります.3つのすぐに利用できる宇宙船選択があるでしょう.それらはSpaceX宇宙船であり、データはSpaceX RESTful APIによって提供されます.ユーザーは、惑星、ドワーフ惑星や目的地として小惑星を選択するオプションがあります.個々の惑星属性は天の川銀河系の太陽系に限られる.惑星の重力が0.0に等しいとき、宇宙船は着陸をすることができません.旅はしない.
View on GitHub
ポストスクリプト
これはFlatiron学校との私のモジュール1 Capstoneプロジェクトです.私は、良いプログラマーになる触媒の一つが建設的な批評を歓迎すると信じています.メッセージをドロップしてください.🙂
冷静にしておきなさい.
外部情報源:
Wikipedia
ASCII Art Archive
fentybit | GitHub | |