1. 程式人生 > >優化程式碼原則--學習筆記

優化程式碼原則--學習筆記

一、單一職責原則

總結來說,一個類中應該是一組相關性秀高的函式 、資料的封裝。也就是說,這一個類,應該僅有一個引起它變化的原因。

以我剛剛寫出的傳送郵件的一個demo為例

private Thread thread = new Thread() { 

@Override public void run() { 

try { send1(); protocol(); //handler.sendEmptyMessage(0); } 

catch (MessagingException e) { e.printStackTrace(); } } }; 

//定義Handler物件 private Handler handler = new Handler() { 

@Override public void handleMessage(android.os.Message m) { super.handleMessage(m); } }; 

private void protocol() {

 try {

 session = Session.getInstance(props,null); 

Transport transport = session.getTransport("smtp"); 

transport.connect("smtp.qq.com","1171546977", "beqaofqqwyeqgbff"); 

Address[] allRecipients = msg.getAllRecipients(); transport.sendMessage(msg,allRecipients); 

runOnUiThread(new Runnable() { 

@Override public void run() {

 ((Button)findViewById(R.id.bt_sendEmailByMail)).setText("傳送成功"); } }); } 

catch (MessagingException e) { e.printStackTrace(); } finally { } }

 private void send1() throws MessagingException { 

props = System.getProperties(); props.setProperty("mail.smtp.host", "smtp.qq.com");

 props.setProperty("mail.smtp.port", "587"); props.setProperty("mail.smtp.starttls.enable", "true"); 

props.setProperty("mail.smtp.password", "beqaofqqwyeqgbff"); //

 props.setProperty("mail.smtp.timeout", "25"); 不能輕易設定超時 props.put("mail.smtp.auth", "true"); 

final String username = "1171546977"; final String password = "beqaofqqwyeqgbff";

 Session session = Session.getDefaultInstance(props, new Authenticator() { 

protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); 

// -- Create a new message -- session.setDebug(true);

 msg = new MimeMessage(session); msg.setContent("Hello", "text/plain"); 

msg.setHeader("Content-Type", "text/html; charset=UTF-8"); // -- Set the FROM and TO fields -- try { 

msg.setFrom(new InternetAddress(username + "@qq.com"));

 msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse( "[email protected]", false)); 

msg.setSubject("Title"); msg.saveChanges(); } catch (MessagingException e) { e.printStackTrace(); } }



剛寫完的程式碼 用javamail傳送郵件主要也就這麼幾個步驟 ,定義Email各種屬性,傳送成功或失敗應該執行什麼。當然中間是開啟了執行緒的,根據單一模式原則我決定 

修改如下 



結果一分為二 分出一個JavaMailHelper類來專門處理javamail的屬性配置  然後加入回撥  使得activity得到它完成傳送後是成功還是失敗的訊號


程式碼如下:

public class JavaMailHelper {

 

private Session session; 

 private Message msg; 

 private Properties props; 

 private Transport transport;

 private OnSendFinishClickListener mListener; 

 public static boolean connected; public JavaMailHelper() {

 transport = null; thread.start(); } 

 private Thread thread = new Thread(new Runnable() { 

 @Override public void run() { init(); } }); 

 private void init() {

 try { props = System.getProperties();

 props.setProperty("mail.smtp.host", "smtp.qq.com");

 props.setProperty("mail.smtp.port", "587"); 

 props.setProperty("mail.smtp.starttls.enable", "true"); 

 props.setProperty("mail.smtp.password", "beqaofqqwyeqgbff"); 

 // props.setProperty("mail.smtp.timeout", "25"); 不能輕易設定超時 

 props.put("mail.smtp.auth", "true"); 

 final String username = "*****************";

 final String password = "******************";

 session = Session.getDefaultInstance(props, new Authenticator() { 

 protected PasswordAuthentication getPasswordAuthentication() { 

 return new PasswordAuthentication(username, password); } });

 // -- Create a new message -- 

 session.setDebug(true); 

 msg = new MimeMessage(session); 

 msg.setContent("Hello", "text/plain");

 msg.setHeader("Content-Type", "text/html; charset=UTF-8");

 // -- Set the FROM and TO fields -- 

 try { msg.setFrom(new InternetAddress(username + "@qq.com"));

 msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse( "***********@qq.com", false)); 

 msg.setSubject("Title"); msg.saveChanges(); session = Session.getInstance(props, null); setTransport(); } catch (MessagingException e) { e.printStackTrace(); } finally { } } catch (MessagingException e1) { e1.printStackTrace(); } }

 public void setTransport() { 

 try { transport = session.getTransport("smtp");

 transport.connect("smtp.qq.com", "*************", "***************"); 

 Address[] allRecipients = msg.getAllRecipients();

 transport.sendMessage(msg, allRecipients);

 if (mListener != null){ 

 mListener.onSendFinishClick(transport.isConnected()); } } catch (MessagingException e) { e.printStackTrace(); } } //這裡,我們定義一個介面 public interface 

OnSendFinishClickListener {

 public void onSendFinishClick(boolean connected); } //寫一個設定介面監聽的方法

 public void setOnObserveSendStateListener(

OnSendFinishClickListener listener) { 

 mListener = listener; }



MainActivity


程式碼如下: //兩種傳送郵件方式 

 private JavaMailHelper javaMailHelper; 

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 

 setContentView(R.layout.activity_main); 

 javaMailHelper = new JavaMailHelper(); javaMailHelper.setOnObserveSendStateListener(new JavaMailHelper.OnSendFinishClickListener() { 

 @Override public void onSendFinishClick(final boolean connected) { runOnUiThread(new Runnable() { 

 @Override public void run() { 

 if (connected){ ((Button) findViewById(R.id.bt_sendEmailByMail)).setText("郵件傳送成功"); }

else{ ((Button) findViewById(R.id.bt_sendEmailByMail)).setText("郵件傳送失敗"); } } }); } }); }


程式碼進行梳理後 自己都感覺看著順眼多了,而且自我感覺分工比較明確