連休はプログラム三昧か・・・・・ | 名作、しかし超有名ではないアルバム(のはず)

名作、しかし超有名ではないアルバム(のはず)

誰もが知っているって感じでもなく、知られざる名盤って感じでもない、その中間あたりのアルバムを紹介するジャケット写真とレビューみたいなもの
※ITネタが続かないので続きそうなネタに変更しました。

mumanです。

ある企画で、twitterAPIを使用するandroidアプリを作っています。
プログラム作ってたころはPHPやASPばかりやってたせいか、javaらしいオブジェクト指向のプログラムにならず、色々と不都合が出てきたので、書きなおしてます。

twitterログインセッションを保持するため、パラメータ引き回すなど、javaプログラマの先輩方に怒られそうなコーディングでしたので・・・

頭で「オブジェクト指向」を理解しているつもりでも、実際意識して書かないとべたーとしたプログラムになるものですね。


まずは、twitterインスタンスの扱いについて、見直しました。

一度twitterAPI(実際はAPIをラップしたtwitter4jを使用)で生成したtwitterインスタンスが、不細工なパラメータ渡しで使用されていたため、TwitterInstanceクラスを準備し、そのクラスを介してオブジェクト参照する方法にしました。

「これ以外の方法があるのかも?」と少々不安ですが、オブジェクト指向にはなってると思います。

(流れ)
 ・メインのActivityでOAuth。
 ・メインActivityでOAuth後にtwitterインスタンスを生成。
 ・このログインセッションを他のActivityでも使用できるように、TwitterInstanceクラスにtwitterインスタンスを以下のメソッドにて静的変数で格納。
   TwitterInstance 任意の変数名 = new TwitterInstance();
   任意の変数名.putInstance(twitterインスタンス);
 ・twitterインスタンスを使う際は、以下のメソッドを発行すればTwitter型でtwitterインスタンスがリターンされる。
   Twitter 任意の変数名 = new TwitterInstance().getInstance();


以下の「TwitterInstanceクラス」はメインのActivityで作成したTwitterインスタンスを静的変数として保持するためのクラスです。

//TwitterInstanceクラス

import twitter4j.Twitter; ← twitter4jライブラリのTwitterクラスをインポート

public class TwitterInstance {

//オブジェクト生成時に同じインスタンスを使用できるよう、静的変数にした
static Twitter mtwitter = null;


//twitterインスタンスを格納するメソッド
void putInstance(Twitter twitter) {
mtwitter = twitter;
}

//twitterインスタンスを提供するメソッド
Twitter getInstance() {
return mtwitter;
}
}

----

以下は、メインのActivityの関連箇所です(oauth、twitter4jのライブラリを使用してます)。
上記のクラスを実際に使用してます。

import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.http.AccessToken;


public class ~Tweet extends Activity {

//ここまで色々省略してますが、OAuthのメソッド

private void submitOAuthConsumer(){
try{
// twitter社より払いだされたOAuthの為の情報を用いて、OAuth処理
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
provider = new DefaultOAuthProvider(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize"
);
String authUrl = provider.retrieveRequestToken(consumer, callbackurl);
Toast.makeText(this, "ブラウザからログインしてください。", Toast.LENGTH_LONG).show();
// OAuth認証URLをアクセス先に指定して、ブラウザをインテント起動
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
}catch(Exception e){
Log.e(APP, e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}

//Twitterインスタンス生成メソッド

private Twitter createTwitterInstance(){
// Twitterインスタンス生成
ConfigurationBuilder cbuilder = new ConfigurationBuilder();
cbuilder.setOAuthConsumerKey(CONSUMER_KEY);
cbuilder.setOAuthConsumerSecret(CONSUMER_SECRET);
cbuilder.setOAuthAccessToken(token);
cbuilder.setOAuthAccessTokenSecret(tokenSecret);
Configuration mConf = cbuilder.build();
TwitterFactory twitterFactory = new TwitterFactory(mConf);
Twitter twitter = twitterFactory.getInstance();
return twitter;
}

----

submitOAuthConsumer(); ← OAuthのメソッド実行



twitterins = new TwitterInstance(); ← twitterinsオブジェクト作成
twitterins.putInstance(createTwitterInstance()); ← Twitterインスタンス生成メソッド実行結果をTwitterInstanceの静的変数に格納

・・・で、以後は以下の形でtwitterインスタンスを使うことが出来ます。

Twitter 任意の変数名3 = new TwitterInstance().getInstance();


連休中はプログラム三昧か・・・・・